1

反序列化具有固定字段名称的小型、固定大小、固定结构的 JSON 字符串很容易:只需定义一个包含所有字段的类(具有正确的类型和名称,在编译时都知道)。

反序列化可变大小的重复嵌套对更具挑战性,但可以借助类内的List<>来完成。

但是,如果在编译时字段名称未知,我该怎么办?例如:

{
   "container":{
      "GD01AB491103":{
         "field_id1":11,
         "field_id2":12,
         "field_id3":13,
         "field_id4":"fourteen"
      },
      "DC01AB491103":{
         "field_id1":21,
         "field_id2":22,
         "field_id3":23,
         "field_id4":"twenty four"
      },
      "GH01AB451101":{
         "field_id1":31,
         "field_id2":32,
         "field_id3":33,
         "field_id4":"thirty four"
      }
      .
      .
      .
   },
   "terminator"
}

如何反序列化这样的字符串?

(最好使用 .NET 的JavaScriptSerializer,但如果它太弱/无能,我可能需要求助于其他东西)

编辑:澄清挑战的性质:在上面的示例中,为了定义一个类:

public class ??????
{
    public int field_id1  {get;set;}
    public int field_id2  {get;set;}
    public int field_id3  {get;set;}
    public string field_id4 {get;set;}
}

我需要先查询 JSON 字符串,然后在运行时构建包含这些变量名类对象的类(反射?)?看起来太麻烦了……也许有更理智的方法?

或者,类/字段名称可能与 .NET 的JavaScriptSerializer无关,而重要的是类型?(当然还有正确的结构)

4

1 回答 1

3

您可以比您想象的更简单地做到这一点..您的??????课程可以是任何东西..

public class GenericObject
{
    public int field_id1  {get;set;}
    public int field_id2  {get;set;}
    public int field_id3  {get;set;}
    public string field_id4 {get;set;}
}

然后将对象图的根反序列化为一个包含Dictionary<string,GenericObject>...的对象

public class SomeContainer
{
    public Dictionary<string,GenericObject> container {get;set;}
}

如果您不关心键的名称,则可以循环遍历字典的值。

于 2012-10-25T16:13:27.423 回答