Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为嵌套api反序列化c#中的json_C#_.net 3.5_Nest Api - Fatal编程技术网

为嵌套api反序列化c#中的json

为嵌套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

我试图用c#、newtonsoft和.net 3.5反序列化下面的设备json结构,但无法生成代码,因为“qxdddh”和“q0tL6au”是动态生成的名称

最终为结构中的每个恒温器创建恒温器类的列表或数组(在本例中为“qxdddh”和“q0tL6au”)

代码的初始尝试是

    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"];