gpt4 book ai didi

c# - 使用 Child 和 Inner Childs 反序列化 JSON

转载 作者:行者123 更新时间:2023-11-30 20:35:59 25 4
gpt4 key购买 nike

我对 JSON.net 有点熟悉,可以反序列化具有基本结构的 JSON(最多一个 child )。我目前正在反序列化从 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);
}

但是对于这么多 child 我还没有理解对象类将如何创建。任何指导将不胜感激。

更新:这是我到目前为止所取得的成就。

我创建了一个主类,如下所示,

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

“Place”类如下,

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

我现在可以成功获取所有数据,除了稍微复杂一点的“度量”。

最佳答案

使用 ,具有任意属性名称但其值的固定模式的 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;

关于c# - 使用 Child 和 Inner Childs 反序列化 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37398451/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com