用嵌套列表反序列化json对象

本文关键字:json 对象 反序列化 列表 嵌套 | 更新日期: 2023-09-27 18:18:18

我有一个包含嵌套列表的对象和一个使用自定义转换器和。net的javascript序列化器从json反序列化它的方法。像这样:

public class MyObject{
      int TheID { get; set; }
      public List<MyNestedObject1> ListOfMyNestedObject1 { get; set; }  
      public List<MyNestedObject2> ListOfMyNestedObject2 { get; set; }
      public MyObject ObjectFromJson(string TheObjectInJson) {
        JavaScriptSerializer TheSerializer = new JavaScriptSerializer();
        TheSerializer.RegisterConverters(new JavaScriptConverter[] {
            new MyObjectConvert()
        });
        TheSerializer.RegisterConverters(new JavaScriptConverter[] {
            new MyNestedObject1Convert()
        });
        TheSerializer.RegisterConverters(new JavaScriptConverter[] {
            new MyNestedObject2Convert()
        });
        //if I comment out the registrations of the converters, it works
        //but I need the converters of the nested objects to kick in
        return TheSerializer.Deserialize<MyObject>(TheObjectInJson);       
    }
}

嵌套对象的json转换器都是这样的:

public class MyNestedObject1Convert : JavaScriptConverter {
  public override IEnumerable<Type> SupportedTypes {
      get { return new Type[] { typeof(MyNestedObject1Convert) };
  }
  public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer) 
  { //deserialization logic
    return MyNestedObject1;}
}

MyObject的转换器是这样的:

public class MyObjectConvert : JavaScriptConverter {
  public override IEnumerable<Type> SupportedTypes { get { return new Type[] { typeof(MyObjectConvert) }; }  
  public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer) {
    int TheID;
    MyObject TheObject = new MyObject();
    int.TryParse(serializer.ConvertToType<string>(dictionary["TheID"]), out TheID))
    TheObject.ID = TheID;
    return TheObject;
    }
}

现在接收json字符串并返回c#对象的调用函数看起来像这样:

MyObject AMyObject = new MyObject();
MyObject TheMyObject = new MyObject();
TheMyObject = AMyObject.ObjectFromJson(JsonString);

当我运行这段代码时,返回的对象包含TheID,但嵌套的对象为空。我在object方法中注册了转换器但我猜这不是正确的做法。如果我删除转换器的注册,对象确实包含嵌套的对象,但是转换器不会启动。

我需要改变什么?注意:我不希望使用其他库,只是为了使本机反序列化器工作。

谢谢你的建议。

用嵌套列表反序列化json对象

好的,我让它工作了。如果你想要反序列化嵌套列表,这就是你要做的。

首先,不要在MyObject ObjectFromJson方法中注册转换器。

第二,在MyObject的自定义转换器中对嵌套列表进行反序列化。这样的:

 public class MyObjectConvert : JavaScriptConverter {
  public override IEnumerable<Type> SupportedTypes { get { return new Type[] { typeof(MyObjectConvert) }; }  
  public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer) {
    int TheID;
    MyObject TheObject = new MyObject();
    int.TryParse(serializer.ConvertToType<string>(dictionary["TheID"]), out TheID))
    TheObject.ID = TheID;
    if (dictionary.ContainsKey("ListOfMyNestedObject1"))
    {
      serializer.RegisterConverters(new JavaScriptConverter[] { new MyNestedObject1Convert() });
      var TheList = serializer.ConvertToType<List<MyNestedObject1>>(dictionary["ListOfMyNestedObject1"]);
      TheObject.ListOfMyNestedObject1 = TheList
    }
    return TheObject;
    }
}

和瞧:json反序列化嵌套列表与。net的javascriptserializer使用自定义javascript转换器。