2013-10-25 4 views
10

У меня есть JSon строку, как показано нижеКак преобразовать JSON массив в список объектов в C#

{ 
"JsonValues":{ 

     "id": "MyID", 

     "values": { 
      "value1":{ 
       "id": "100", 
       "diaplayName": "MyValue1" 
      }, 
      "value2":{ 
       "id": "200", 
       "diaplayName": "MyValue2" 
      } 
     } 
} 
} 

Я хочу, чтобы преобразовать JSON строку ниже классов

class ValueSet 
    { 
    [JsonProperty("id")] 
    public string id 
    { 
     get; 
     set; 
    } 
    [JsonProperty("values")] 
    public List<Value> values 
    { 
     get; 
     set; 
    } 
    } 

class Value 
{ 
    public string id 
    { 
     get; 
     set; 
    } 
    public string DiaplayName 
    { 
     get; 
     set; 
    } 
} 

Мой десериализации код

JavaScriptSerializer js = new JavaScriptSerializer(); 
     StreamReader sr = new StreamReader(@"ValueSetJsonString.txt"); 
     string jsonString = sr.ReadToEnd(); 
     var items = JsonConvert.DeserializeObject<ValueSet>(jsonString); 

Но я получаю нулевые значения после сериализации, как я могу это решить?

ответ

13

Как уже отмечалось, причина, по которой вы не получаете ожидаемых результатов, заключается в том, что ваш JSON не соответствует структуре классов, к которой вы пытаетесь десериализоваться. Вам либо нужно изменить JSON, либо изменить классы. Поскольку другие уже показали, как изменить JSON, я возьму здесь противоположный подход.

Чтобы соответствовать JSON, который вы опубликовали в своем вопросе, ваши классы должны быть определены следующим образом. Уведомление Я внесла следующие изменения:

  1. Я добавил класс Wrapper, соответствующий внешнему объекту в вашем JSON.
  2. Я изменил Values свойство ValueSet класса из List<Value> к Dictionary<string, Value> поскольку values свойства в вашем JSON содержит объект, а не массив.
  3. Я добавил несколько дополнительных атрибутов [JsonProperty], чтобы они соответствовали именам свойств в ваших объектах JSON.

определения Класс:

class Wrapper 
{ 
    [JsonProperty("JsonValues")] 
    public ValueSet ValueSet { get; set; } 
} 

class ValueSet 
{ 
    [JsonProperty("id")] 
    public string Id { get; set; } 
    [JsonProperty("values")] 
    public Dictionary<string, Value> Values { get; set; } 
} 

class Value 
{ 
    [JsonProperty("id")] 
    public string Id { get; set; } 
    [JsonProperty("diaplayName")] 
    public string DisplayName { get; set; } 
} 

Вы должны десериализации в Wrapper класса, а не ValueSet класса. Затем вы можете получить ValueSet с Wrapper.

var valueSet = JsonConvert.DeserializeObject<Wrapper>(jsonString).ValueSet; 

Вот рабочая программа для демонстрации:

class Program 
{ 
    static void Main(string[] args) 
    { 
     string jsonString = @" 
     { 
      ""JsonValues"": { 
       ""id"": ""MyID"", 
       ""values"": { 
        ""value1"": { 
         ""id"": ""100"", 
         ""diaplayName"": ""MyValue1"" 
        }, 
        ""value2"": { 
         ""id"": ""200"", 
         ""diaplayName"": ""MyValue2"" 
        } 
       } 
      } 
     }"; 

     var valueSet = JsonConvert.DeserializeObject<Wrapper>(jsonString).ValueSet; 

     Console.WriteLine("id: " + valueSet.Id); 
     foreach (KeyValuePair<string, Value> kvp in valueSet.Values) 
     { 
      Console.WriteLine(kvp.Key + " id: " + kvp.Value.Id); 
      Console.WriteLine(kvp.Key + " name: " + kvp.Value.DisplayName); 
     } 
    } 
} 

А вот выход:

id: MyID 
value1 id: 100 
value1 name: MyValue1 
value2 id: 200 
value2 name: MyValue2 
+0

(jsonString) .ValueSet; суффикс сделал это для меня! – peterincumbria

0

у вас есть непревзойденная строка JSON, если вы хотите преобразовать в список, попробуйте этот

{ 
    "id": "MyID", 

    "values": [ 
     { 
      "id": "100", 
      "diaplayName": "MyValue1", 
     }, 
     { 
      "id": "200", 
      "diaplayName": "MyValue2", 
     } 
    ]  
} 
+0

спасибо. Я изменил строку json так, но все же я получаю нулевые значения. – niknowj

1

вашу структуру данные, и ваш JSON не совпадает.

Ваш JSON заключается в следующем:

{ 
    "JsonValues":{ 
     "id": "MyID", 
     ... 
    } 
} 

Но структура данных вы пытаетесь сериализовать его заключается в следующем:

class ValueSet 
{ 
    [JsonProperty("id")] 
    public string id 
    { 
     get; 
     set; 
    } 
    ... 
} 

Вы пропускаете шаг: Ваш JSON класс, который имеет одну свойство с именем JsonValues, которое имеет объект вашей структуры данных ValueSet как значение.

Также внутри вашего класса ваш JSON это:

"values": { ... } 

Ваша структура данных заключается в следующем:

[JsonProperty("values")] 
public List<Value> values 
{ 
    get; 
    set; 
} 

Обратите внимание, что { .. } в JSON определяет объект, в котором, как [ .. ] определяет массив. Так что, согласно вашему JSON, у вас нет кучу значений, но у вас есть one объект ценностей со свойствами value1 и value2 типа Value.

Поскольку десериализатор ожидает массив, но вместо него получает объект, он выполняет наименее неразрушающую (исключение) вещь, которую он может сделать: пропустите значение. Ваше имущество values остается с его значением по умолчанию: null.

Если вы можете: Отрегулируйте свой JSON. Следующее будет соответствовать вашей структуре данных и, скорее всего, вы действительно хотите:

{ 
    "id": "MyID", 

    "values": [ 
     { 
      "id": "100", 
      "diaplayName": "MyValue1" 
     }, { 
      "id": "200", 
      "diaplayName": "MyValue2" 
     } 
    ] 
} 
+0

Я изменил структуру json как это, но все же я получаю нулевые значения в объекте – niknowj

+0

Я упустил это. Обратите внимание, что на вашем C# у вас есть 'DiaplayName', но в вашем JSON есть' diaplayName'. Имена чувствительны к регистру. Или измените свое имя свойства в C#, JSON или используйте 'JsonPropertyAttribute', чтобы сообщить сериализатору имя JSON вашего свойства. – user2674389

+1

Также всегда было бы лучше быть точнее с описаниями ошибок в StackOverflow. Вы получаете «нулевые значения в объекте» - точно, что равно null? Весь объект, который вы получаете? Ваш список? Единственное свойство? Какая собственность? Чем точнее вы, тем легче люди могут вам помочь (и, возможно, вы даже заметите ошибку самостоятельно). – user2674389

0

Вы проверили эта линия работает отлично & ваша строка имеет значение в нем?

string jsonString = sr.ReadToEnd();

если да, то попробуйте этот код на последней строке:

ValueSet items = JsonConvert.DeserializeObject<ValueSet>(jsonString);

или если у вас есть массив JSON, вы можете использовать список, как это:

List<ValueSet> items = JsonConvert.DeserializeObject<List<ValueSet>>(jsonString);

удача

-1

Это тоже возможно:

using System.Web.Helpers; 
    var listOfObjectsResult = Json.Decode<List<DataType>>(JsonData); 
5

http://json2csharp.com/

Я нашел вышеупомянутую ссылку невероятно полезной, поскольку она исправила мои классы C#, создав их из JSON, который был фактически возвращен.

Тогда я назвал:

JsonConvert.DeserializeObject<RootObject>(jsonString); 

и все работало, как ожидалось.

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