2017-01-09 65 views
3

我試圖解析JSON,我相信對象數組。我可以用JObject.Parse解析簡單的單個JSON,但是這個讓我頭疼。在datagridview中顯示JSON對象數組

{ 
"2": { 
    "num": 5, 
    "average": 10, 
    "state": true, 
    "id": 2, 
    "buy": 10, 
    "name": "name" 
}, 
"6": { 
    "num": 5, 
    "average": 10, 
    "state": true, 
    "id": 6, 
    "buy": 20, 
    "name": "name" 
} 
} 

我有想法,但不知道如何處理括號前的數字。它總是和「id」一樣。

我試圖使用Newtonsoft.Json是這樣的:

List<Items> objlis = (List<Items>)Newtonsoft.Json.JsonConvert.DeserializeObject(json, typeof(List<Items[]>)); 

但是它說,「類型需要JSON陣列(例如[1,2,3]),以正確地反序列化。」

+0

你的代碼是什麼樣的?你期望它做什麼?它如何失敗? – ThatBlairGuy

+0

使用'Dictionary '不列出。請參閱[從ID爲名稱的json對象創建強類型的c#對象](https://stackoverflow.com/questions/34213566/create-a-strongly-typed-c-sharp-object-from-json-object-與-ID-作爲最名稱/)。 – dbc

回答

0

看起來好像發送系統選擇了序列化稀疏列表作爲JSON對象,其中對象名稱是列表索引,而不是JSON數組。但Json.NET maps JSON arrays from and to c# lists所以你的反序列化到List<Items>失敗,異常消息該類型需要一個JSON數組(例如[1,2,3])來正確地反序列化。

反序列化這樣的JSON對象最簡單的方法是作爲一個dictionaryDictionary<string, Items>SortedDictionary<int, Items>如在this question示出,例如:

var dict = JsonConvert.DeserializeObject<SortedDictionary<int, Items>>(json); 

如果特別需要的JSON被反序列化作爲列表,你可以寫一個custom JsonConverter進行映射:

public class ListToDictionaryConverter<T> : JsonConverter where T : class 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     return typeof(List<T>).IsAssignableFrom(objectType); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     if (reader.TokenType == JsonToken.Null) 
      return null; 
     var list = existingValue as List<T> ?? (List<T>)serializer.ContractResolver.ResolveContract(objectType).DefaultCreator(); 
     if (reader.TokenType == JsonToken.StartArray) 
      serializer.Populate(reader, list); 
     else if (reader.TokenType == JsonToken.StartObject) 
     { 
      var dict = serializer.Deserialize<Dictionary<int, T>>(reader); 
      foreach (var pair in dict) 
       list.SetOrAddAt(pair.Key, pair.Value, default(T)); 
     } 
     else 
     { 
      throw new JsonSerializationException(string.Format("Invalid token {0}", reader.TokenType)); 
     } 
     return list; 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     var list = (IList<T>)value; 
     writer.WriteStartObject(); 
     for (int i = 0; i < list.Count; i++) 
     { 
      // Omit null values. 
      if (list[i] == default(T)) 
       continue; 
      writer.WritePropertyName(((JValue)i).ToString()); 
      serializer.Serialize(writer, list[i]); 
     } 
     writer.WriteEndObject(); 
    } 
} 

public static class ListExtensions 
{ 
    public static void SetOrAddAt<T>(this IList<T> list, int index, T value, T defaultValue = default(T)) 
    { 
     if (list == null) 
      throw new ArgumentNullException("list"); 
     list.EnsureCount(index + 1, defaultValue); 
     list[index] = value; 
    } 

    public static void EnsureCount<T>(this IList<T> list, int count, T defaultValue = default(T)) 
    { 
     if (list == null) 
      throw new ArgumentNullException("list"); 
     int oldCount = list.Count; 
     if (count > oldCount) 
     { 
      for (int i = oldCount; i < count; i++) 
       list.Add(defaultValue); 
     } 
    } 
} 

然後使用它像:

var objlis = JsonConvert.DeserializeObject<List<Items>>(json, new ListToDictionaryConverter<Items>()); 

樣品fiddle

1
var result = JsonConvert.DeserializeObject<List<JsonResult>>(input); 
dataGridView.DataSource = result; 
+0

與前面提到的一樣,錯誤 –

0

可以建表像的Json以下命令,然後打電話給datagridview的

List<User> allusers = JsonConvert.DeserializeObject<List<User>>(jsonString); 

public static DataTable MakeDataTable<T>(this IList<T> data) 
     { 
     PropertyDescriptorCollection props = 
     TypeDescriptor.GetProperties(typeof(T)); 
     DataTable table = new DataTable(); 
     for(int i = 0 ; i < props.Count ; i++) 
     { 
     PropertyDescriptor prop = props[i]; 
     table.Columns.Add(prop.Name, prop.PropertyType); 
     } 
     object[] values = new object[props.Count]; 
     foreach (T item in data) 
     { 
     for (int i = 0; i < values.Length; i++) 
     { 
      values[i] = props[i].GetValue(item); 
     } 
     table.Rows.Add(values); 
     } 
     return table;   
    }