У меня есть объект, содержащий вложенные списки и метод десериализации его из json с использованием пользовательских преобразователей и сериализатора javascript .net. Что-то вроде этого:десериализация 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, но вложенные объекты равны нулю. Я регистрирую конвертеры в методе объектов, но я предполагаю, что это не способ сделать это. Если я удалю регистрацию конвертеров, объект DOES содержит вложенные объекты, но тогда преобразователи не будут вставлять.
Что мне нужно изменить? Примечание. Я не хочу использовать другую библиотеку, просто чтобы работать с родным десериализатором.
Спасибо за ваши предложения.
Вы сделали что-нибудь самостоятельно для своего «пользовательского конвертера», не спрашивая в SO? –
@ L.B: вопросы должны отвечать за других, которые тоже будут нуждаться в них. Вот что делает концепцию SO великолепной. – frenchie
'вопросы должны быть ответом для других, которые тоже будут нуждаться в них'. :) –