使用嵌套列表反序列化json对象
问题描述:
我有一个包含嵌套列表的对象以及使用自定义转换器和.net的JavaScript序列化器从json反序列化它的方法。事情是这样的:使用嵌套列表反序列化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,但嵌套对象为null。我正在使用对象方法注册转换器,但我猜这不是做这件事的方法。如果我删除了转换器的注册,该对象将包含嵌套对象,但是转换器不会踢入。
我需要更改哪些内容?注意:我不打算使用另一个库,只是为了使本地解串器工作。
感谢您的建议。
答
好的,所以我才开始工作。如果你想反序列化嵌套列表,这是你如何做到的。
首先,不要在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反序列化使用自定义JavaScript转换器.NET的javascriptserializer。
你有没有为自己的`自定义转换器`做任何事情,而没有在这么问? – 2011-12-16 20:58:02