【问题标题】:How to deserialize an array containig strings and objects in JSON.NET如何在 JSON.NET 中反序列化包含字符串和对象的数组
【发布时间】:2013-12-19 12:30:11
【问题描述】:

我正在尝试将特殊数组反序列化为 Visual Basic 中的对象。 以下 json 数据由我使用的 web 服务传递;我感兴趣的部分是“数据”属性;基本上它是一个字符串数组的数组,每个数组代表一个对象:

{"timestamp":1385984969075,
"data":
[
  [1590,null,null,null,0],
  [1020,"data a",null,null,0],
  [1025,"data b",null,null,0],
  ...
  [2756,"data c",null,
    [
      {"id":2,"name":"Tom","mail":"tom@test.te","f_id":6,"md":1},
      {"id":3,"name":"Carl","mail":"carl@test.te","f_id":6,"md":1}
     ]
  ,3],
  [1277,"data d",null,null,0],
  ...
  ]}

在此示例中,每个数组的数据项 4 可能为 null 或包含对象数组。

我想将数组反序列化为对象列表,但我无法让它工作。我搜索了很多类似的帖子,但到目前为止我找不到任何有用的东西。

(我使用 Visual Basic.net 编写,但欢迎使用 C# 示例。)

有人可以帮忙吗?

【问题讨论】:

  • 我反序列化为一个字符串数组列表。这种方法一开始是有效的,因为最初我没有答案,其中有一个对象数组。我使用 Dim answer As New contactGetAnswerObject answer = CType(JsonConvert.DeserializeObject(conn.serverResponse, GetType(contactGetAnswerObject)), contactGetAnswerObject) Public Class contactGetAnswerObject Public Property timestamp As Long Public Property data As List(Of string()) End Class,
  • 您是否自己编写了这个生成 JSON 的 Web 服务?为什么你不能简单地拥有一个模型对象类,你可以从中创建一个对象列表/数组?
  • 不,我没有自己编写网络服务。 Web 服务的输出是可变的;您必须在服务请求中发送所需属性的列表。然后您会收到一个数组,其中包含与请求匹配的每个项目所需属性的数组。
  • 顺便说一句:我是 json.net 包的新手,所以如果我没有看到明显的内容,请原谅我。
  • 发布你的课程,你也在映射这个 JSON 数据。

标签: c# arrays vb.net serialization json.net


【解决方案1】:

更新:

这是另一个使用对象数组来映射您拥有的数组的示例。然后我提取了数组中的每条数据。

再次希望这会对您有所帮助:

var list = new People
        {
            PersonList = new object[]
            {
              new object[]
             {
               "Test1", "Test2", "Test3", null, new object[]{new Person{Name="John", Age=21}}, 1
             },
              new object[]
             {
               "Test4", "Test5", "Test6", null, null, 2
             },
             new object[]
             {
               "Test17", "Test8", "Test9", null, new object[]{new Person{Name="Sara", Age=31}}, 3
             },
                new object[]
             {
               "Test10", "Test11", "Test12", null, null, 4
             },
             new object[]
             {
                 "Test13", "Test14", "Test15", null, new object[]{new Person{Name="John", Age=31}}, 5
             }
             }
        };

        string output = JsonConvert.SerializeObject(list);

        var objList = JsonConvert.DeserializeObject<People>(output);

        objectList = objList.PersonList;

        foreach(JArray objectItem in objectList)
        {

            var stringOne = (string)objectItem[0];
            var stringTwo = (string)objectItem[1];
            var stringthree = (string)objectItem[2];
            var nullObj = objectItem[3];

            foreach(var individual in objectItem[4])
            {
                JObject obj = (JObject)JToken.FromObject(individual);
                var person = obj.ToObject<Person>();

                string name = person.Name;
                int age = person.Age;
            }
            var num = (int)objectItem[5];
        }

JSON:

{
"PersonList": [
    [
        "Test1",
        "Test2",
        "Test3",
        null,
        [
            {
                "Name": "John",
                "Age": 21
            },
            {
                "Name": "Pete",
                "Age": 44
            }
        ],
        1
    ],
    [
        "Test4",
        "Test5",
        "Test6",
        null,
        null,
        2
    ],
    [
        "Test17",
        "Test8",
        "Test9",
        null,
        [
            {
                "Name": "Sara",
                "Age": 31
            }
        ],
        3
    ],
    [
        "Test10",
        "Test11",
        "Test12",
        null,
        null,
        4
    ],
    [
        "Test13",
        "Test14",
        "Test15",
        null,
        [
            {
                "Name": "John",
                "Age": 31
            }
        ],
        5
    ]
]

}

人物类:

 public class Person
{
    public string Name { set; get; }

    public int Age { set; get; }
}

PeopleList 类:

 public class People
{
    public object[] PersonList { set; get; }
}

【讨论】:

  • 非常感谢您的努力!唉,这对我没有帮助。您的代码会序列化然后反序列化对象数组。但是在我的示例中没有纯对象数组。它是一个包含字符串和一个对象(也可能为空)的数组。
  • 我会写一个 CustomCreationConverter,但我并不完全理解这个机制。有你知道的很好的例子或教程吗?是不是像我“插入”某种类型的反序列化函数(在这种情况下为字符串数组)并为它编写自己的代码?
【解决方案2】:

再次非常感谢您的努力!我已将您的示例代码翻译成 VB.NET(请注意,定义“列表”对象的第一个块必须是 Visual Studio 中的一行;我刚刚对其进行了格式化以便更好地了解):

Dim list = New People With {.PersonList = 
        New Object() { 
            New Object() {"Test1", "Test2", "Test3", Nothing, New Object() 
                   {New Person With {.Name = "John", .Age = 21}}, 
            1}, 
            New Object() {"Test4", "Test5", "Test6", Nothing, Nothing, 2}, 
            New Object() {"Test17", "Test8", "Test9", Nothing, New Object() 
                   {New Person With {.Name = "Sara", .Age = 31}}, 
            3}, 
            New Object() {"Test10", "Test11", "Test12", Nothing, Nothing, 4}, 
            New Object() {"Test13", "Test14", "Test15", Nothing, New Object() 
                   {New Person With {.Name = "John", .Age = 31}}, 
            5} 
        } 
    }

    Dim output As String = JsonConvert.SerializeObject(list)
    MessageBox.Show(output)

    Dim objList = JsonConvert.DeserializeObject(Of People)(output)

    Dim objectList As Object() = objList.PersonList

    For Each objectItem As JArray In objectList
        Dim stringOne As String = CStr(objectItem(0))
        Dim stringTwo As String = CStr(objectItem(1))
        Dim stringThree As String = CStr(objectItem(2))
        Dim nullObj As Object = objectItem(3)
        For Each individual As Object In objectItem(4)
            Dim obj As JObject = DirectCast(JToken.FromObject(individual), JObject)
            Dim person As Person = obj.ToObject(Of Person)()
            Dim name As String = person.Name
            Dim age As Integer = person.Age
        Next
        Dim num As Integer = CInt(objectItem(5))

    Next

基本上这种方法是我现在正在尝试做的。我只是认为必须有一种更优雅的方式(无意冒犯!)使用 JSON.NET。 在我看来,最大的缺点是 for-each 循环中的类型转换列表。我的数据对象有大约 110 个属性,其中两个有子对象,每个子对象有 10 个属性。我的项目中还有 3 或 4 个其他数据对象,其大小至少为一半。

所以我的想法是编写一个从目标对象派生属性类型的函数,然后或多或少地自动进行类型转换。我有一个用于 Web 服务调用的属性名称列表,因此该列表可用于查找与响应项对应的属性名称。

反正我会看看 jArray 和 jObject,因为我还没有用过这些。

【讨论】:

  • 如果我的代码让您走上正轨并回答了问题,请随时将我的答案标记为正确。很高兴它可以提供帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多