【问题标题】:deserializing json object with nested lists使用嵌套列表反序列化 json 对象
【发布时间】:2011-12-16 20:30:19
【问题描述】:

我有一个包含嵌套列表的对象和一个使用自定义转换器和 .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 但嵌套对象为空。我正在对象方法中注册转换器,但我猜这不是这样做的方法。如果我删除转换器的注册,该对象确实包含嵌套对象,但是转换器不会启动。

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

感谢您的建议。

【问题讨论】:

  • 你有没有为你的custom converter 自己做过任何事情而没有在 SO 中询问?
  • @L.B:这些问题旨在为其他需要它们的人提供答案。这就是 SO 概念的伟大之处。
  • the questions are meant to be answers for others who'll need them too。 :)
  • 你为什么不使用这个:json2csharp.com 来生成你的类?
  • @SamFisher83:我正在使用 JavascriptSerializer,如果我注释掉转换器的注册,我确实会生成嵌套类。我只需要弄清楚如何正确注册转换器即可。本机 JavascriptSerializer 工作得很好。

标签: c# asp.net json


【解决方案1】:

好的,所以我开始工作了。如果您希望反序列化嵌套列表,您可以这样做。

首先,不要在 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;
    }
}

瞧:使用 .net 的 javascriptserializer 使用自定义 javascript 转换器对嵌套列表进行 json 反序列化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-08
    • 2014-03-08
    • 1970-01-01
    • 1970-01-01
    • 2016-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多