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

7

我还没有完全找到我所寻找的确切答案,所以想试着问一下这个问题。

我目前正尝试使用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。

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

Dim JSONString As String

JSONString = "<JSONStringDetails>"

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

很不幸的是,当输入此内容时,会返回以下结果,程序中止:

Newtonsoft.Json.JsonSerializationException 类型的未处理异常发生于 Newtonsoft.Json.dll。

额外信息:无法将当前 JSON 数组(例如 [1,2,3])反序列化为类型“ShadOS.JSONStringCollection+GeneralArray”,因为该类型需要一个 JSON 对象(例如 {"name":"value"})才能正确反序列化。

我漏掉了什么?

不太熟悉JSON,但听起来问题出在JSON上,而不是反序列化程序或您的对象。 - Tim
1个回答

6
你的 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)

关键在于您告诉Newtonsoft,目标类型是List(Of CombinedItem) - 一种类似于数组/集合的目标。
现在,JSONObjCombinedItem的集合 - 其中一些将具有Value/Text属性,而其他一些将具有InnerList/Duplicated属性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接