为嵌套api反序列化c#中的json
我试图用c#、newtonsoft和.net 3.5反序列化下面的设备json结构,但无法生成代码,因为“qxdddh”和“q0tL6au”是动态生成的名称 最终为结构中的每个恒温器创建恒温器类的列表或数组(在本例中为“qxdddh”和“q0tL6au”) 代码的初始尝试是为嵌套api反序列化c#中的json,c#,.net-3.5,nest-api,C#,.net 3.5,Nest Api,我试图用c#、newtonsoft和.net 3.5反序列化下面的设备json结构,但无法生成代码,因为“qxdddh”和“q0tL6au”是动态生成的名称 最终为结构中的每个恒温器创建恒温器类的列表或数组(在本例中为“qxdddh”和“q0tL6au”) 代码的初始尝试是 public class Devices { public TstatDetails[] thermostats { get; set; } } public class T
public class Devices
{
public TstatDetails[] thermostats { get; set; }
}
public class TstatDetails
{
public string locale { get; set; }
public string temperature_scale { get; set; }
public string is_using_emergency_heat { get; set; }
public string has_fan { get; set; }
public string software_version { get; set; }
public string has_leaf { get; set; }
public string device_id { get; set; }
public string name { get; set; }
public string can_heat { get; set; }
public string can_cool { get; set; }
public string hvac_mode { get; set; }
public string target_temperature_c { get; set; }
public string target_temperature_f { get; set; }
public string target_temperature_high_c { get; set; }
public string target_temperature_high_f { get; set; }
public string target_temperature_low_c { get; set; }
public string target_temperature_low_f { get; set; }
public string ambient_temperature_c { get; set; }
public string ambient_temperature_f { get; set; }
public string away_temperature_high_c { get; set; }
public string away_temperature_high_f { get; set; }
public string away_temperature_low_c { get; set; }
public string away_temperature_low_f { get; set; }
public string structure_id { get; set; }
public string fan_timer_active { get; set; }
public string name_long { get; set; }
public string is_online { get; set; }
}
及
Devices tstats=(Devices)Newtonsoft.Json.JsonConvert.DeserializeObject(jsonstring);
它会生成一个异常,并具有以下描述
无法反序列化当前JSON对象(例如{“名称”:“值”})
输入类型“nestest.nestouth2+TstatDetails[]”,因为
需要JSON数组(例如[1,2,3])才能正确反序列化
要修复此错误,请将JSON更改为JSON数组(例如。
[1,2,3])或更改反序列化类型,使其成为普通的.NET
类型(例如,不是integer之类的基元类型,也不是集合类型
类似于数组或列表),可以从JSON对象反序列化。
还可以将JsonObjectAttribute添加到类型以强制其
从JSON对象反序列化
我理解这个错误(我想),但是对于c语言来说,我是个新手,我不确定如何纠正这种情况。你的Json对象应该是一个数组,而不仅仅是一个对象 它基本上应该用
[…]
包装(其中您肯定可以有多个对象),而不是{…}
它可能看起来与此类似:
[
{
"locale": "en-US",
"temperature_scale": "F",
"is_using_emergency_heat": false,
...
},
{
"locale": "en-US",
"temperature_scale": "F",
"is_using_emergency_heat": false,
...
}
]
编辑
好吧,我不能和双向飞碟比赛。
但我会留下我的答案,因为它也是正确的(只有一个解决问题的选项)。只需将
设备更改为类,使用字典而不是数组:
public class Devices
{
public Dictionary<string, TstatDetails> thermostats { get; set; }
}
一旦成功,我强烈建议您尝试将所有属性名称变得更加常规:)感谢您为我们提供了足够的代码来帮助您,但您能否将其简化为几个属性?这将使一切变得更简单。@user2761903您是如何检索Json的?谢谢,这正是所需要的。使用了Jon上面的答案,但也用于此信息。
[
{
"locale": "en-US",
"temperature_scale": "F",
"is_using_emergency_heat": false,
...
},
{
"locale": "en-US",
"temperature_scale": "F",
"is_using_emergency_heat": false,
...
}
]
public class Devices
{
public Dictionary<string, TstatDetails> thermostats { get; set; }
}
TstatDetails details = tstats["qxdddh"];