如何使用变量名反序列化可变大小的JSON字符串

时间:2012-10-25 15:51:54

标签: c# json javascriptserializer jsonserializer

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

对可变大小的重复嵌套对进行反序列化更具挑战性,但可以在类中List<>的帮助下完成。

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

{
   "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无关,所有问题都是类型? (当然是正确的结构)

1 个答案:

答案 0 :(得分: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;}
}

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