2014-12-01 3 views
0

У меня есть ответ JSON от веб-сервера, который я пытаюсь Deserialize во что-то, с чем я могу работать в своем коде на C#.Deserialize json objects/arrays

{ 
"sprints": [ 
    { 
     "id": 377, 
     "sequence": 377, 
     "name": "Sprint 1", 
     "state": "CLOSED", 
     "linkedPagesCount": 0 
    }, 
    { 
     "id": 354, 
     "sequence": 354, 
     "name": "Sprint 2", 
     "state": "CLOSED", 
     "linkedPagesCount": 0 
    } 
], 
"velocityStatEntries": { 
    "354": { 
     "estimated": { 
      "value": 19, 
      "text": "19.0" 
     }, 
     "completed": { 
      "value": 15, 
      "text": "15.0" 
     } 
    }, 
    "377": { 
     "estimated": { 
      "value": 21, 
      "text": "21.0" 
     }, 
     "completed": { 
      "value": 19, 
      "text": "19.0" 
      } 
     } 
    } 
} 

выше, как представляется, является массивом (спринты), то объект (velocityStatEntries) -> объект (например, 354) -> Объект (оценка) и объекта (завершено).

Я пытался Deserialize с JsonConvert.DeserializeObject<DataSet>(t);, но я получаю исключение:

Дополнительная информация: Неожиданный токен JSON при чтении DataTable. Ожидаемый StartArray, получил StartObject. Path 'speedStatEntries', строка 1, позиция 630.

, что очевидно, потому что оно не понимает, что есть массив, тогда есть что-то еще. Могу ли я каким-то образом указать, какие данные у меня есть, не создавая полную структуру кода, например, классов?

/donnib

ответ

0

последняя версия json.net позволяет это сделать:

dynamic d = JObject.Parse("{number:10, str:'string', array: [1,2,3]}"); 

Console.WriteLine(d.number); 
Console.WriteLine(d.str); 
Console.WriteLine(d.array.Count); 

выход:

10 
string 
3 

Документация здесь: LINQ to JSON with Json.NET

0

У вас есть достаточно несколько способов:

Вы можете получить списки для массивов и словарей JSON для объектов JSON.

List<Dictionary<string,List<Dictionary<string,object>>>> 

Вы можете явно определить структуру данных с использованием классов объектов:

public class Sprint { 
    public int id; 
    public int sequence; 
    public string name; 
    public string state; 
    public int linkedPagesCount; 
} 

public class Sth { 
    public Sprint[] sprints; 
    ... 
} 

new JavaScriptSerializer().Deserialize<Sth>(mySthVariable) 

Вы можете использовать dynamic тип данных.

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