我对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;这有点复杂。
答案 0 :(得分:3)
使用json.net,具有任意属性名称但其值固定模式的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结构。