2013-10-25 11 views
10

Mam JSON ciąg jak poniżejJak przekonwertować json tablicy do listy obiektów w C#

{ 
"JsonValues":{ 

     "id": "MyID", 

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

chcę przekonwertować json ciąg poniżej klas

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

Mój kod deserializacji jest

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

Ale otrzymuję wartości null po serializacji, Jak mogę rozwiązać ten problem?

Odpowiedz

13

Jak już inni zauważyli, powodem, dla którego nie osiągasz oczekiwanych rezultatów jest to, że twój JSON nie pasuje do struktury klas, którą próbujesz przekształcić w deserializację. Musisz zmienić JSON lub zmienić swoje zajęcia. Ponieważ inni już pokazali, jak zmienić JSON, zastosuję tutaj podejście odwrotne.

Aby dopasować JSON, który napisałeś w swoim pytaniu, twoje klasy powinny być zdefiniowane jak te poniżej. Uwaga Wprowadziłem następujące zmiany:

  1. Dodałem klasę Wrapper odpowiadającą zewnętrznemu obiektowi w twoim JSON.
  2. Zmieniłem właściwość Values klasy ValueSet z List<Value> na Dictionary<string, Value>, ponieważ właściwość values w JSON zawiera obiekt, a nie tablicę.
  3. Dodałem kilka dodatkowych atrybutów [JsonProperty], aby dopasować nazwy właściwości w obiektach JSON.

definicje Klasa:

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

Trzeba deserializowania do klasy Wrapper, a nie klasy ValueSet. Następnie można uzyskać ValueSet z Wrapper.

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

Oto program roboczy w celu wykazania:

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

I tu jest wyjście:

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

(jsonString) .ValueSet; sufiks zrobił to za mnie! – peterincumbria

0

masz niezrównaną JSON ciąg, jeśli chcesz przekonwertować na liście, spróbuj tego

{ 
    "id": "MyID", 

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

dziękuję. Zmieniłem ciąg jsonów w ten sposób, ale nadal otrzymuję wartości null. – niknowj

1

strukturę danych i Twój JSON nie pasują.

Twój JSON jest taka:

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

Ale struktura danych spróbować szeregować je to:

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

Jesteś omijając etap: Twój JSON jest klasa, która posiada jeden właściwość o nazwie JsonValues, która ma obiekt o swojej strukturze danych ValueSet jako wartość.

także wewnątrz klasy Twój JSON jest taka:

"values": { ... } 

struktury danych to:

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

Zauważ, że { .. } w JSON definiuje obiekt, gdzie jako [ .. ] definiuje tablicę. Tak więc, zgodnie z twoim JSON, nie masz wielu wartości, ale masz obiekt wartości one o właściwościach value1 i value2 typu Value.

Ponieważ deserializator oczekuje tablicy, ale zamiast niej otrzymuje obiekt, robi to najmniej nieniszczącą rzecz (wyjątek): pomiń wartość. Twoja własność values pozostaje z domyślną wartością: null.

Jeśli możesz: Dostosuj swój JSON. Następujące elementy pasują do twojej struktury danych i najprawdopodobniej to, czego potrzebujesz:

{ 
    "id": "MyID", 

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

Zmieniłem strukturę jsonów, ale nadal otrzymuję wartości null w obiekcie – niknowj

+0

Przeoczyłem to. Zwróć uwagę, że w twoim C# masz 'DiaplayName', ale w twoim JSON masz' diaplayName'. Nazwy są wrażliwe na przypadki. Zmień nazwę właściwości w C#, JSON lub użyj 'JsonPropertyAttribute', aby przekazać serializatorowi nazwę JSON twojej właściwości. – user2674389

+1

Zawsze lepiej byłoby dokładniej opisywać błędy w StackOverflow. Otrzymujesz 'wartości null w obiekcie' - dokładnie to, co jest zerowe? Cały obiekt otrzymasz? Twoja lista? Jedna właściwość? Która nieruchomość? Im jesteś bardziej precyzyjny, tym łatwiej Ci pomóc (a może nawet sam zauważysz błąd). – user2674389

0

Czy sprawdzić ta linia działa idealnie & ciąg mieć wartość w nim?

string jsonString = sr.ReadToEnd();

jeśli tak, spróbuj tego kodu do ostatniego wiersza:

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

lub jeśli masz tablicę JSON można użyć listy tak:

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

powodzenia

-1

Jest to możliwe także:

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

http://json2csharp.com/

Znalazłem powyższe łącze bardzo pomocne, ponieważ poprawiono moje klasy C#, generując je z JSON, który został faktycznie zwrócony.

Potem zadzwoniłem:

JsonConvert.DeserializeObject<RootObject>(jsonString); 

i wszystko działało zgodnie z oczekiwaniami.

Powiązane problemy