【问题标题】:Can not deserialize JSON Object, because it's actually a poorly formatted Array无法反序列化 JSON 对象,因为它实际上是格式不佳的 Array
【发布时间】:2016-09-07 11:37:13
【问题描述】:

我正在尝试将 JSON 对象(它是一个数组)反序列化为名为 County 的公共类的通用列表。这是我收到的 JSON 的摘录:

{
    "Alachua":0,
    "Baker":1,
    "Bay":2,
    "Bradford":3,
    "Brevard":4,
    "Broward":5,
    "Calhoun":6,
    "Charlotte":7
}

课程如下:

<Serializable()> _
Public Class County
    Private _name As String
    Private _code As Integer

    Public Property Code() As Integer
        Get
            Return Me._code
        End Get
        Set(value As Integer)
            Me._code = value
        End Set
    End Property

    Public Property Name() As String
        Get
            Return Me._name
        End Get
        Set(value As String)
            Me._name = value
        End Set
    End Property
End Class

但是,由于 JSON 数组的格式不正确,因此我无法对其进行序列化。

我目前正在使用 Newtonsoft:

Dim countyResponse As List(Of County) = ParseRequestJSON(Of List(Of County))(request)

这是一个例外:

无法将当前 JSON 对象(例如 {"name":"value"})反序列化为类型 'System.Collections.Generic.List`1[Models.County]',因为该类型需要 JSON 数组(例如 [1 ,2,3]) 以正确反序列化。要修复此错误,要么将 JSON 更改为 JSON 数组(例如 [1,2,3]),要么将反序列化类型更改为普通的 .NET 类型(例如,不是像整数这样的原始类型,而不是像这样的集合类型可以从 JSON 对象反序列化的数组或列表。 JsonObjectAttribute 也可以添加到类型中以强制它从 JSON 对象反序列化。路径“Alachua”,第 2 行,位置 12。

我们将不胜感激,请不要被 VB.net 吓到。

【问题讨论】:

  • 输入是一个格式正确的 JSON 对象。所以将其反序列化为一个(可以映射到一个IDictionary):然后按照程序的要求将其转换为一个数组。
  • 你是对的。它的格式正确。这不是我所期望的。
  • 某人/某物生成了 JSON 输入。一个简单的消费者只需要处理;即使它可能以不同的方式和/或更适当地序列化。如果还控制生产者,则可以更改序列化和有线合同。
  • 我无法修改回复,但您的建议有效。我将其发布为我自己问题的答案。感谢您的帮助和快速响应!!!

标签: arrays json serialization json.net json-deserialization


【解决方案1】:

感谢@user2864740,我们有了答案。反序列化为带有字符串键和整数值的 IDictionary。然后我循环浏览 IDictionary 并将县添加到列表中。

Dim countyResponse As IDictionary(Of String, Integer) = ParseRequestJSON(Of IDictionary(Of String, Integer))(request)

If IsNothing(countyResponse) = False Then
    For Each c In countyResponse
        Dim county As County = New County
        county.Code = c.Value
        county.Name = c.Key

        Counties.Add(county)
    Next
End If

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-14
    • 1970-01-01
    • 2016-12-30
    • 2014-08-04
    • 1970-01-01
    • 2016-10-08
    相关资源
    最近更新 更多