2017-01-11 3 views
1

У меня есть массив JSON. Я хочу отобразить/deserialize это в следующий класс.Deserialize JSON-объект в C# с использованием Newtonsoft json.net

public sealed class DataItem{ 
    public string UserId {get; set;} 
    public string TestId {get; set;} 
    public string UserName{get; set;} 
    public string Data1 {get; set;} 
    public string Data2 {get; set;} 
    public string Data3 {get; set;} 
    public string Data4 {get; set;} 
    public string Data5 {get; set;} 
    public string Data6 {get; set;} 
    public string Data7 {get; set;} 
    public string Data8 {get; set;} 
    public string Data9 {get; set;} 
    public string Data10 {get; set;} 
    ... 
    ... 
} 

JSON массива:

[{ 
    "UserId": "5656", 
    "TestId": "562", 
    "UserName": "testuser", 
    "Data1": "dang", 
    "Data2": "phy", 
    "Data3": "right", 
    "Data4": "left", 
    "Data5": "top", 
    "Data6": "abc", 
    "Data7": "rat", 
    "Data8": "test", 
    "Data9": "91", 
    "Data10": "9090", 
    ... 
    ... 
}, { 
    "UserId": "8989", 
    "TestId": "12", 
    "UserName": "abc", 
    "Data1": "111", 
    "Data2": "222", 
    "Data3": "Pwww", 
    "Data4": "aaa", 
    "Data5": "bbbb", 
    "Data6": "cc", 
    "Data7": "ooo", 
    "Data8": "hh", 
    "Data9": "g", 
    "Data10": "5656", 
    ... 
    ... 

}] 

В моей программе я сделал так:

IList<DataItem> allItem = JsonConvert.DeserializeObject<IList<DataItem>>(myJsonArray); 

Это прекрасно работает.

Но в моем случае имеется около 1000 Datas внутри массива json, например Data1 до Data1000, который исходит из базы данных. И я не хочу, чтобы определить 1000 DATAS в моем классе «DataItem» как:

public sealed class DataItem{ 
    ... 
    ... 
    public string Data1 {get; set;} 
    public string Data2 {get; set;} 
    . 
    . 
    . 
    public string Data1000 {get; set;} 
} 

Есть ли способ, чтобы решить эту проблему, используя некоторые динамические классы или объекты для отображения этих 1000 DATAS (Data1 к Data1000).

Я думаю использовать массив длиной 1000 и отобразить их так, и я знаю, что это не сработает.

public sealed class DataItem{ 
    public string UserId {get; set;} 
    public string TestId {get; set;} 
    public string[] Data {get; set;} 
} 

public DataItem(){ 
    Data = new string[1000]; 
} 

И в моей программе:

DataItem dataItem = new DataItem(); 
IList<DataItem> allItem = JsonConvert.DeserializeObject<IList<DataItem>>(myJsonArray); 

P.S. Я не могу изменить структуру массива JSON.

+0

Можете ли вы просто использовать динамический объект вместо класса DataItem? 'JsonConvert.DeserializeObject > (myJsonArray);'? – squillman

+0

Вы можете сделать что-то вроде 'dynamic data = Json.Decode (json);' – Majid

ответ

2

Вы можете попробовать немного другой метод:

JObject obj = JObject.Parse(jsonString); // gets processed json object 
DataItem item = new DataItem(); 
item.UserId = obj.SelectToken("UserId").Value<string>(); 
//.. fill rest of the data 
string format = "Data{0}"; 
for(int i = 0; i < item.Data.Length; i++) // iterate through all Data[x] 
{ 
    item.Data[i] = obj.SelectToken(string.Format(format, i)).Value<string>(); 
} 

И вы можете упаковать это в какой-то фантазии метод, как:

public DataItem DeserializeFromJson(string json) 
{ 
    // put that code in here 
} 

Edit:

Так что проблема (как вы сказали ранее) заключается в том, что у вас есть массив Json. Мой метод состоял в том, чтобы показать только горячий, чтобы прочитать один объект из массива.

Теперь, чтобы все было ясно. Если вы хотите десериализовать массив, я бы рекомендовал десериализовать ввод в List<JObject> с использованием метода JsonConvert.DeserializeObject<T>(), а затем использовать метод DeserializeFromJson(), который я предложил вам сделать из приведенного выше фрагмента.

Комбинируя их, можно добиться чего-то вроде этого:

public IEnumerable<DataItem> DeserializeListFromJson(string jsonArray) 
{ 
    return JsonConverter.DeserializeObject<List<JObject>>(jsonArray).Select(obj => DeserializeFromJson(obj)); 
} 

// updated 
public DataItem DeserializeFromJson(JObject obj) 
{ 
    DataItem result = new DataItem(); 
    item.UserId = obj.SelectToken("UserId").Value<string>(); 
    //.. fill rest of the data 
    string format = "Data{0}"; 
    for(int i = 0; i < item.Data.Length; i++) // iterate through all Data[x] 
    { 
     item.Data[i] = obj.SelectToken(string.Format(format, i)).Value<string>(); 
    } 
} 
+0

Hi @ m.rogalski, я пробовал то же самое. Но это дает исключение при анализе массива JSON в первой строке. –

+0

@ KishorBikramOli, пожалуйста, прочитайте обновленный ответ и дайте мне несколько отзывов. –

1

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

Ниже приведен пример преобразования строки JSON, предоставленной в вопросе, успешно в список словаря. Вместо списка вы можете преобразовать в массив словаря.

var jsonData = "[{\"UserId\":\"5656\",\"TestId\":\"562\",\"UserName\":\"testuser\",\"Data1\":\"dang\",\"Data2\":\"phy\",\"Data3\":\"right\",\"Data4\":\"left\",\"Data5\":\"top\",\"Data6\":\"abc\",\"Data7\":\"rat\",\"Data8\":\"test\",\"Data9\":\"91\",\"Data10\":\"9090\"},{\"UserId\":\"8989\",\"TestId\":\"12\",\"UserName\":\"abc\",\"Data1\":\"111\",\"Data2\":\"222\",\"Data3\":\"Pwww\",\"Data4\":\"aaa\",\"Data5\":\"bbbb\",\"Data6\":\"cc\",\"Data7\":\"ooo\",\"Data8\":\"hh\",\"Data9\":\"g\",\"Data10\":\"5656\"}]"; 

      var data = JsonConvert.DeserializeObject<List<Dictionary<string, string>>>(jsonData); 

      Console.WriteLine("Total : {0}", data.Count); 
      Console.WriteLine("Item1 Total : {0}", data[0].Count); 
      Console.WriteLine("Item2 Total : {0}", data[1].Count); 

      foreach(var item in data) 
      { 
       Console.WriteLine("--- Propertie start-----"); 
       foreach(var kvPair in item) 
       { 
        Console.WriteLine("property name : {0}", kvPair.Key); 
        Console.WriteLine("property value : {0}", kvPair.Value); 
       } 
       Console.WriteLine("--- Propertie end-----"); 
      } 

      Console.ReadLine(); 

Это решит вашу проблему.

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