无法反序列化当前的JSON数组(例如)

我正在尝试阅读我的JSON结果。

这是我的RootObject

public class RootObject { public int id { get; set; } public bool is_default { get; set; } public string name { get; set; } public int quantity { get; set; } public string stock { get; set; } public string unit_cost { get; set; } } 

这是我的JSON结果

 [{"id": 3636, "is_default": true, "name": "Unit", "quantity": 1, "stock": "100000.00", "unit_cost": "0"}, {"id": 4592, "is_default": false, "name": "Bundle", "quantity": 5, "stock": "100000.00", "unit_cost": "0"}] 

这是我读取结果的代码

  public static RootObject GetItems(string user, string key, Int32 tid, Int32 pid) { // Customize URL according to geo location parameters var url = string.Format(uniqueItemUrl, user, key, tid, pid); // Syncronious Consumption var syncClient = new WebClient(); var content = syncClient.DownloadString(url); return JsonConvert.DeserializeObject(content); } 

但我遇到此错误的问题:

无法将当前JSON数组(例如[1,2,3])反序列化为类型’avaris_cash_salepoint.BL.UniqueItemDataRootObject’,因为该类型需要JSON对象(例如{“name”:“value”})才能正确反序列化。 要修复此错误,请将JSON更改为JSON对象(例如{“name”:“value”})或将反序列化类型更改为数组或实现集合接口的类型(例如ICollection,IList),例如List从JSON数组反序列化。 JsonArrayAttribute也可以添加到类型中以强制它从JSON数组反序列化。 路径”,第1行,第1位。

在这一行:return JsonConvert.DeserializeObject(content);

有任何帮助来解决这个错误?

我认为你遇到的问题是你的JSON是一个对象列表,当它进来时它并不直接与你的根类相关。

var content看起来像这样(我假设):

 [ { "id": 3636, "is_default": true, "name": "Unit", "quantity": 1, "stock": "100000.00", "unit_cost": "0" }, { "id": 4592, "is_default": false, "name": "Bundle", "quantity": 5, "stock": "100000.00", "unit_cost": "0" } ] 

注意:使用http://jsonviewer.stack.hu/格式化您的JSON。

所以如果你尝试以下它应该工作:

  public static List GetItems(string user, string key, Int32 tid, Int32 pid) { // Customize URL according to geo location parameters var url = string.Format(uniqueItemUrl, user, key, tid, pid); // Syncronious Consumption var syncClient = new WebClient(); var content = syncClient.DownloadString(url); return JsonConvert.DeserializeObject>(content); } 

如果您不希望返回RootObject列表,则需要进行迭代。


我继续在控制台应用程序中测试它,工作正常。

在此处输入图像描述

那是因为你得到的json是你的RootObject类的数组,而不是单个实例,将你的DeserialiseObject更改为DeserialiseObject (未经测试)。

然后,您必须更改方法以返回RootObject集合,或者对反序列化对象执行进一步处理以返回单个实例。

如果您查看您提供的响应的格式化版本:

 [ { "id":3636, "is_default":true, "name":"Unit", "quantity":1, "stock":"100000.00", "unit_cost":"0" }, { "id":4592, "is_default":false, "name":"Bundle", "quantity":5, "stock":"100000.00", "unit_cost":"0" } ] 

你可以在那里看到两个实例。

您可以使用它来解决您的问题:

 private async void btn_Go_Click(object sender, RoutedEventArgs e) { HttpClient webClient = new HttpClient(); Uri uri = new Uri("http://www.school-link.net/webservice/get_student/?id=" + txtVCode.Text); HttpResponseMessage response = await webClient.GetAsync(uri); var jsonString = await response.Content.ReadAsStringAsync(); var _Data = JsonConvert.DeserializeObject >(jsonString); foreach (Student Student in _Data) { tb1.Text = Student.student_name; } } 

你有一个数组,将其转换为一个对象,如:

data:[{“id”:3636,“is_default”:true,“name”:“Unit”,“quantity”:1,“stock”:“100000.00”,“unit_cost”:“0”},{“id “:4592,”is_default“:false,”name“:”Bundle“,”quantity“:5,”stock“:”100000.00“,”unit_cost“:”0“}]