C# 将对象从json反序列化为类的最佳方式是什么?

C# 将对象从json反序列化为类的最佳方式是什么?,c#,json,object,httpclient,C#,Json,Object,Httpclient,我正在通过使用web服务api实现一个GPS跟踪系统 错误: Newtonsoft.Json.dll中发生类型为“Newtonsoft.Json.JsonSerializationException”的未处理异常 其他信息:无法将当前JSON数组(例如[1,2,3])反序列化为“TrackingRequest.Devices”类型,因为该类型需要一个JSON对象(例如{“name”:“value”})才能正确反序列化 要修复此错误,请将JSON更改为JSON对象(例如{“name”:“value

我正在通过使用web服务api实现一个GPS跟踪系统

错误:

Newtonsoft.Json.dll中发生类型为“Newtonsoft.Json.JsonSerializationException”的未处理异常

其他信息:无法将当前JSON数组(例如[1,2,3])反序列化为“TrackingRequest.Devices”类型,因为该类型需要一个JSON对象(例如{“name”:“value”})才能正确反序列化

要修复此错误,请将JSON更改为JSON对象(例如{“name”:“value”}),或将反序列化类型更改为数组或实现可从JSON数组反序列化的集合接口(例如ICollection、IList)类似列表的类型。还可以将JsonArrayAttribute添加到类型中,以强制它从JSON数组反序列化

这是一个用c#编写的web表单应用程序,它使用Newtonsoft的json
HttpClient

我的代码

using (HttpClient clientKey = new HttpClient())
                   {
                        clientKey.BaseAddress = new Uri("http://api.trackingdiary.com/");
                        clientKey.DefaultRequestHeaders.Add("Hive-Session", key);
                        clientKey.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

                        HttpResponseMessage responseKey = clientKey.GetAsync("/v2/geo/devices/list").Result;
                        using (HttpContent contentkey = responseKey.Content)
                       {
                            Task<string> resultKey = contentkey.ReadAsStringAsync();
                            Devices obj = JsonConvert.DeserializeObject<Devices>(resultKey.Result);

                           Console.WriteLine();
                       }
                   }
我希望在对象中在DataTable中执行

JSON示例

您的JSON字符串似乎包含所讨论类型的对象数组。您正试图将其反序列化为单个实例,因此会出现错误

试试这个:

IEnumerable<Devices> devices = JsonConvert.DeserializeObject<IEnumerable<Devices>>(resultKey.Result);
IEnumerable devices=JsonConvert.DeserializeObject(resultKey.Result);

请将该类重命名为singular,因为它似乎表示单个
设备

它看起来像您的JSON字符串包含所讨论类型的对象数组。您正试图将其反序列化为单个实例,因此会出现错误

试试这个:

IEnumerable<Devices> devices = JsonConvert.DeserializeObject<IEnumerable<Devices>>(resultKey.Result);
IEnumerable devices=JsonConvert.DeserializeObject(resultKey.Result);

请将该类重命名为singular,因为它似乎表示单个
设备

您可以显示一个示例
json
响应吗请?C#约定要求您的属性应为PASCALCASE:
Id
Name
DateContacted
等。它们不需要匹配传入的JSON,这由
[JsonProperty(“date\u contacted”)]
如果不使用JSON,很难确定,但错误信息似乎很清楚:您正试图将数组转换为对象。@TobySmith this ispascalCaseNotCamelcase butthis isCamelcase。返回的JSON是一个设备列表,而不是一个单独的设备对象。能否显示一个示例
JSON
您正在处理的响应请?C#按照惯例,您的属性应该是PASCALCASE:
Id
Name
DateContacted
等。它们不需要匹配传入的JSON,由
[JsonProperty(“date\u contacted”)处理
如果不使用JSON,很难确定,但错误消息似乎很清楚:您试图将数组转换为对象。@TobySmith ThisIsPascalCaseNotCamelCase butThisIsCamelCase。返回的JSON是一个设备列表,而不是一个设备对象这可能就是答案,但由于OP没有提供足够的信息,我们无法判断。“真的应该等待具体的信息。”大卫格。对。虽然这个错误很有启发性,但如果看不到实际的有效负载,就无法判断。据你所知,他可能会收到一个完全不同的[序列化]类型,LOL…它可以工作。非常感谢非常快速的解决方案。这可能是现在的答案,但由于OP没有提供足够的信息,我们无法判断。“真的应该等待具体的信息。”大卫格。对。虽然这个错误很有启发性,但如果没有看到实际的有效负载,就无法判断。据你所知,他可能会收到一个完全不同的[序列化]类型,LOL…它可以工作。非常感谢您提供了非常快速的解决方案。