2015-03-03 3 views
0

Я использую Json.net для десериализации данных JSON из существующего сервиса. Образец:Json.net десериализовать те же объекты с разными именами

{ 
    "id" : 3223, 
    "name" : "position 3223", 
    "containers" : { 
     "container_demo" : { 
      "id" : 12, 
      "name" : "demo", 
      "value" : 34 
     }, 
     "different_name_1" : { 
      "id" : 33, 
      "name" : "demo 3", 
      "value" : 1 
     }, 
     "another_contaier" : { 
      "id" : 1, 
      "name" : "another demo", 
      "value" : 34 
     } 
    } 
} 

Как мы видим, мы имеем ту же структуру и разные названия объектов в container объекта. ТАГЕТ является десериализовать containers, как массив объектов Container:

public class Root 
{ 
    public int id {set;get;} 
    public string name {set;get;} 
    Array<Container> containers {set;get;} 
} 

public class Container 
{ 
    public int id {set; get;} 
    public string name {set;get;} 
    public int value {set;get;} 
} 

Как решить эту проблему? Можно ли использовать CustomCreationConverter<T>, чтобы десериализовать это правильно?

+0

Свойство 'container' является общим типом? Расскажите о своих классах, пожалуйста. –

+0

Я не знаю, является ли это общим на сервере, но в моей реализации C# это не является общим. – user2598575

+1

это опечатка извините. я исправил – user2598575

ответ

3

Update

Учитывая ваши обновленные классы и обновленные JSON, вы могли бы сделать:

public class RootObject 
{ 
    public Root root { get; set; } 
} 

public class Root 
{ 
    public int id {set;get;} 
    public string name {set;get;} 
    public Dictionary<string, Container> containers { get; set; } 
} 

public class Container 
{ 
    public int id {set; get;} 
    public string name {set;get;} 
    public int value {set;get;} 
} 

И использовать это нравится:

 var root = JsonConvert.DeserializeObject<RootObject>(json); 

Обратите внимание, что "root" свойство в формате JSON требует дополнительного уровня косвенности, который мы предоставили классу RootObject. Возможно, вы захотите переименовать свой Root в нечто более наглядное, как RootContainer.

Update 2

JSON в вопросе был изменен еще раз, чтобы устранить "root" свойство, так RootObject не нужна и вам просто нужно сделать:

 var root = JsonConvert.DeserializeObject<Root>(json); 

Оригинал ответа

Предполагая, что ваш вложенный containers также имеют тип Container, вы можете просто сериализации их как Dictionary<string, Container> собственности:

public class Container 
{ 
    public int id { set; get; } 
    public string name { set; get; } 
    public int? value { set; get; } // Null when the property was not present in the JSON. 
    public Dictionary<string, Container> containers { get; set; } 
} 

Вы бы использовать его как:

public static void Test() 
    { 
     string json = @" 
     { 
      ""id"" : 3223, 
      ""name"" : ""position 3223"", 
      ""containers"" : { 
       ""container_demo"" : { 
        ""id"" : 12, 
        ""name"" : ""demo"", 
        ""value"" : 34 
       }, 
       ""different_name_1"" : { 
        ""id"" : 33, 
        ""name"" : ""demo 3"", 
        ""value"" : 1 
       }, 
       ""another_contaier"" : { 
        ""id"" : 1, 
        ""name"" : ""another demo"", 
        ""value"" : 34 
       } 
      } 
     }"; 

     var container = JsonConvert.DeserializeObject<Container>(json); 

     JsonSerializerSettings settings = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }; 

     Debug.WriteLine(JsonConvert.SerializeObject(container, Formatting.Indented, settings)); 
    } 

Это производит вывод:

{ 
    "id": 3223, 
    "name": "position 3223", 
    "containers": { 
    "container_demo": { 
     "id": 12, 
     "name": "demo", 
     "value": 34 
    }, 
    "different_name_1": { 
     "id": 33, 
     "name": "demo 3", 
     "value": 1 
    }, 
    "another_contaier": { 
     "id": 1, 
     "name": "another demo", 
     "value": 34 
    } 
    } 

Как вы можете видеть, все данные десериализации и сериализованная успешно.

1

Попробуйте структуру данных, как это -

public class Holder 
{ 
    public int id { set; get; } 

    public string name { set; get; } 

    public Dictionary<string, Container> containers{ get; set; } 
} 


public class Container 
{ 
    public int id { set; get; } 

    public string name { set; get; } 

    public int value { set; get; } 
} 

и десериализации JSON для этого Holder класса.

var holders = JsonConvert.DeserializeObject<Holder> (json); 
+0

, это не работает (словарь 'container' равен нулю – user2598575

+0

Я могу заставить его работать отлично. – Muctadir

+0

Извините, у меня есть тип в моем коде. Вы совершенно. Оно работает! – user2598575

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