2016-05-23 3 views
2

Я немного знаком с JSON.net и могу Deserialize JSON с базовой структурой (до одного ребенка). Я в настоящее время в процессе десериализации JSON, который возвращается из Netatmo API. Структура JSON для меня сложна. Ниже приводится основная структура JSON,Deserializing JSON с детьми и внутренними детьми

_id 
place 
    location 
     Dynamic Value 1 
     Dynamic Value2 
    altitude 
    timezone 
mark 
measures 
    Dynamic Value 1 
    res 
     Dynamic Value 1 
       Dynamic Value 1 
      Dynamic Value 2 
    type 
     Dynamic Value 1 
     Dynamic Value 2 
modules 
    Dynamic Value 1 

динамическое значение 1 и динамическое значение 2 означает, что значения изменяется для каждого идентификатора. Полный JSON приведен ниже,

{ 
    "body": [{ 
     "_id": "70:ee:50:02:b4:8c", 
     "place": { 
      "location": [-35.174779762001, -5.8918476117544], 
      "altitude": 52, 
      "timezone": "America\/Fortaleza" 
     }, 
     "mark": 0, 
     "measures": { 
      "02:00:00:02:ba:2c": { 
       "res": { 
        "1464014579": [16.7, 77] 
       }, 
       "type": ["temperature", "humidity"] 
      }, 
      "70:ee:50:02:b4:8c": { 
       "res": { 
        "1464014622": [1018.1] 
       }, 
       "type": ["pressure"] 
      } 
     }, 
     "modules": ["02:00:00:02:ba:2c"] 
    }, { 
     "_id": "70:ee:50:12:40:cc", 
     "place": { 
      "location": [-16.074257294385, 11.135715243973], 
      "altitude": 14, 
      "timezone": "Africa\/Bissau" 
     }, 
     "mark": 14, 
     "measures": { 
      "02:00:00:06:7b:c8": { 
       "res": { 
        "1464015073": [26.6, 78] 
       }, 
       "type": ["temperature", "humidity"] 
      }, 
      "70:ee:50:12:40:cc": { 
       "res": { 
        "1464015117": [997] 
       }, 
       "type": ["pressure"] 
      } 
     }, 
     "modules": ["02:00:00:06:7b:c8"] 
    }], 
    "status": "ok", 
    "time_exec": 0.010364055633545, 
    "time_server": 1464015560 
} 

Я смущен, глядя на сложную структуру этого JSON. Для одного уровня JSON я использовал этот код в прошлом,

IList<lstJsonAttributes> lstSearchResults = new List<lstJsonAttributes>(); 
foreach (JToken objResult in objResults) { 
    lstJsonAttributes objSearchResult = JsonConvert.DeserializeObject<lstJsonAttributes>(objResult.ToString()); 
    lstSearchResults.Add(objSearchResult); 
} 

Но так много детей, я до сих пор понять, как будет создан объект класса. Любое руководство будет высоко оценено.

Обновление: Это то, чего я до сих пор добился.

Я создал основной класс, как показано ниже,

public class PublicDataClass 
{ 
    public string _id { get; set; } 
    public PublicData_Place place { get; set; } 
    public string mark { get; set; } 
    public List<string> modules { get; set; } 
} 

и класс «Место» как следует,

public class PublicData_Place 
{ 
    public List<string> location { get; set; } 
    public string altitude { get; set; } 
    public string timezone { get; set; } 
} 

Тогда я Десериализованный объект в следующей строке кода,

var obj = JsonConvert.DeserializeObject<List<PublicDataClass>>(jsonString); 

Теперь я могу успешно получить все данные, кроме «мер», которые немного сложнее.

ответ

1

Использование Объекты JSON, которые имеют произвольные имена свойств, но фиксированные схемы для их значений, могут десериализоваться как Dictionary<string, T> для соответствующего типа T. См. Deserialize a Dictionary. Таким образом, ваши "measures" и "res" объекты могут быть смоделированы как словари.

Вам также нужен корневой объект для инкапсуляции вашего List<PublicDataClass>, так как ваш корневой контейнер JSON представляет собой такой объект: { "body": [{ ... }] }.

Таким образом, вы можете определить свои классы следующим образом:

public class RootObject 
{ 
    public List<PublicDataClass> body { get; set; } 
    public string status { get; set; } 
    public double time_exec { get; set; } 
    public int time_server { get; set; } 
} 

public class PublicDataClass 
{ 
    public string _id { get; set; } 
    public PublicData_Place place { get; set; } 
    public int mark { get; set; } 
    public List<string> modules { get; set; } 
    public Dictionary<string, Measure> measures { get; set; } 
} 

public class PublicData_Place 
{ 
    public List<double> location { get; set; } // Changed from string to double 
    public double altitude { get; set; } // Changed from string to double 
    public string timezone { get; set; } 
} 

public class Measure 
{ 
    public Measure() 
    { 
     this.Results = new Dictionary<string, List<double>>(); 
     this.Types = new List<string>(); 
    } 

    [JsonProperty("res")] 
    public Dictionary<string, List<double>> Results { get; set; } 

    [JsonProperty("type")] 
    public List<string> Types { get; set; } 
} 

Затем сделайте

var root = JsonConvert.DeserializeObject<RootObject>(jsonString); 
var obj = root.body; 
+0

пачкой Спасибо за ваш ответ, и как вы объяснили это. Я медленно дошел до этого момента. Я использовал http://json2csharp.com/ для преобразования объектов JSON в C#. Он не успешно создал объект для измерений, но затем ссылался на другой пост на SO и преобразовал весь JSON в динамический объект. Он создал все и заполнил все данные. Я просто смотрел на объекты в окне QuickWatch и выяснил, что вложенные дочерние объекты для Measures создаются в виде словаря.Пользовательский тип гораздо проще работать с вложенными динамическими объектами. –

+0

Я только что протестировал его, и это сработало без проблем. Еще раз спасибо. –

1

Я работал с XML в течение нескольких лет, и мое изменение структуры JSON у меня тоже немного запуталось, всегда, что я хочу посмотреть, как выглядит объект. Я использую этот веб-сайт. jsoneditoronline Просто скопируйте и вставьте ваш JSON и щелкните по стрелке, чтобы проанализировать объект, я надеюсь, что это поможет, пока вы не привыкнете к структуре JSON.