使用Child和Inner Childs反序列化JSON

时间:2016-05-23 18:53:31

标签: c# json.net

我对JSON.net有点熟悉,可以用基本结构(最多一个孩子)反序列化JSON。我目前正在反序列化从Netatmo API返回的JSON。 JSON的结构对我来说很复杂。以下是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表示为每个ID更改的值。完整的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; }
}

和&#34;放置&#34;课程如下,

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);

我现在可以成功获取除&#34;措施之外的所有数据&#34;这有点复杂。

2 个答案:

答案 0 :(得分:3)

使用,具有任意属性名称但其值固定模式的JSON对象可以反序列化为适当类型Dictionary<string, T>的{​​{1}}。有关详细信息,请参阅Deserialize a Dictionary。因此,您的T"measures"对象可以建模为字典。

您还需要一个根对象来封装您的"res",因为您的根JSON容器是这样的对象:List<PublicDataClass>

因此,您可以按如下方式定义类:

{ "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; }
}

答案 1 :(得分:1)

我已经使用XML了几年而且我对JSON结构的改变我也有点困惑,总是希望我看到一个对象看起来像我使用这个网站{{ 3}}只需复制并粘贴你的JSON并点击箭头来解析一个对象,我希望它有用,直到你习惯了JSON结构。