2011-12-16 4 views
0

У меня есть объект, содержащий вложенные списки и метод десериализации его из 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 содержит вложенные объекты, но тогда преобразователи не будут вставлять.

Что мне нужно изменить? Примечание. Я не хочу использовать другую библиотеку, просто чтобы работать с родным десериализатором.

Спасибо за ваши предложения.

+0

Вы сделали что-нибудь самостоятельно для своего «пользовательского конвертера», не спрашивая в SO? –

+0

@ L.B: вопросы должны отвечать за других, которые тоже будут нуждаться в них. Вот что делает концепцию SO великолепной. – frenchie

+0

'вопросы должны быть ответом для других, которые тоже будут нуждаться в них'. :) –

ответ

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; 
    } 
} 

И вуаля: десериализации JSON вложенных списков с JavaScriptSerializer .NET, используя пользовательский JavaScript преобразователей.

Смежные вопросы