vb.NET将JSON列表反序列化为对象

时间:2015-03-10 21:51:18

标签: json vb.net json.net

我找不到我认为的确切答案,所以我觉得我在提问时有点蠢蠢。

我目前正在尝试使用Json.NET将JSON字符串反序列化为vb.NET中的对象;我之前已经完成了一些操作,设置了适当的类,然后使用父类将字符串反序列化为一个对象,并且它们工作得很好但是这个似乎并没有完全正确地分解。

我试图分解的字符串示例如下:

   [
    {
        "value": 12345,
        "text": "Example Unique Text"
    },
    {
        "InnerList": [
            {
                "value": 4746,
                "text": "A duplicated entry of text"
            },
            {
                "value": 4747,
                "text": "A duplicated entry of text"
            },
            {
                "value": 4748,
                "text": "A duplicated entry of text"
            },
            {
                "value": 4749,
                "text": "A duplicated entry of text"
            },
            {
                "value": 4750,
                "text": "A duplicated entry of text"
            },
            {
                "value": 4751,
                "text": "A duplicated entry of text"
            },
            {
                "value": 4752,
                "text": "A duplicated entry of text"
            },
            {
                "value": 4753,
                "text": "A duplicated entry of text"
            },
            {
                "value": 4754,
                "text": "A duplicated entry of text"
            },
            {
                "value": 4755,
                "text": "A duplicated entry of text"
            }
        ],
        "duplicated": "Yes"
    },
    {
        "value": 15298,
        "text": "Another Example Unique Text"
    },
    {
        "value": 959,
        "text": "Yet more uniqueness"
    },
    {
        "value": 801,
        "text": "A final little bit of unique text"
    }
]

我已经尝试通过一些外部工具传递它们,但它们都返回了相同的类定义,但它们似乎无法正常工作。基于我对JSON的理解,我将以下内容放在一起:

 Public Class ItemDetails

        Public Value As Integer
        Public Text As String

 End Class

 Public Class ItemArray

        Public DetailList As List(Of ItemDetails)
        Public Duplicated As String

 End Class

 Public Class GeneralArray

        Public GeneralList As List(Of ItemArray)

 End Class

GeneralArray是父类,是用于解析JSON的内容。

然后我尝试将字符串反序列化为父类。在以下示例中,上面概述的JSON字符串和JSONStringCollection是定义GeneralArray的模块:

Dim JSONString As String

JSONString = "<JSONStringDetails>"

Dim JSONObj = JsonConvert.DeserializeObject(Of JSONStringCollection.GeneralArray)(JSONString)

可悲的是,当通过时,返回以下内容并且例程中断:

  

未处理的类型异常   &#39; Newtonsoft.Json.JsonSerializationException&#39;发生在   Newtonsoft.Json.dll

     

其他信息:无法反序列化当前的JSON数组   (例如[1,2,3])类型&#39; ShadOS.JSONStringCollection + GeneralArray&#39;因为   type需要一个JSON对象(例如{&#34; name&#34;:&#34; value&#34;})来反序列化   正确。

我对此缺少什么?

1 个答案:

答案 0 :(得分:4)

您的JSON字符串表示对象的数组(您可以看到这一点,因为所有内容都包含在[]之间。)

错误消息是“您试图将对象数组反序列化为单个对象”。您的目标类型GeneralArray的行为与数组不同(例如,它不从数组/集合类型继承,也不实现集合接口)。

另一个问题是,JSON数组是“混合的” - 它包含一些看起来像ItemDetails的对象和其他看起来像ItemArray的对象。在像VB.NET这样的静态语言中,更难以反序列化为单个不同类型的集合。

一种可能的解决方案是将目标类ItemDetailsItemArray合并到一个类中,与

一致。
Public Class CombinedItem
    'properties from ItemDetails
    Public Value As Integer
    Public Text As String

    'properties from ItemArray
    Public InnerList As List(Of CombinedItem)
    Public Duplicated As String

End Class

鉴于此类,您的反序列化可能如下所示:

Dim JSONObj = JsonConvert.DeserializeObject(Of List(Of CombinedItem))(JSONString)

这里的关键是你告诉牛顿软件目标类型是List(Of CombinedItem) - 一个像目标一样的数组/集合。

现在JSONObjCombinedItem的集合 - 有些会有Value / Text属性,有些会有InnerList / {{1属性。