2017-01-09 6 views
3

Im пытается разобрать JSON, который я считаю массив объектов. Я могу разобрать простой JSON с JObject.Parse, но это дает мне головную боль.Показать массив объектов JSON в datagridview

{ 
"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 ' not list. См. [Создание строго типизированного объекта C# из объекта json с идентификатором как имя] (https://stackoverflow.com/questions/34213566/create-a-strongly-typed-c-sharp-object-from-json-object- с-ид-как-имя-/). – dbc

ответ

0

Это выглядит так, как будто посылая система выбрала сериализовать разреженный список как объект JSON, где имена объектов являются индексов списка, а не как массив JSON. Но Json.NET maps JSON arrays from and to c# lists, поэтому ваша десериализация до List<Items> с ошибкой требует, чтобы для десериализации правильно потребовался массив JSON (например, [1,2,3]).

Самый простой способ десериализации такой объект JSON является как dictionary, такие как Dictionary<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;   
    }