无法反序列化当前的JSON数组(例如[1,2,3])

Dja*_*ama 12 c# arrays serialization json json.net

我正在尝试阅读我的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; }
}
Run Code Online (Sandbox Code Playgroud)

这是我的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"}]
Run Code Online (Sandbox Code Playgroud)

这是我读取结果的代码

     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<RootObject>(content);

    }
Run Code Online (Sandbox Code Playgroud)

但我遇到此错误的问题:

无法将当前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);

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

Day*_*yan 23

我认为你遇到的问题是你的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"
  }
]
Run Code Online (Sandbox Code Playgroud)

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

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

  public static List<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<List<RootObject>>(content);

    }
Run Code Online (Sandbox Code Playgroud)

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


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

在此输入图像描述


小智 5

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

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 <List<Student>>(jsonString);
    foreach (Student Student in _Data)
    {
        tb1.Text = Student.student_name;
    }
}
Run Code Online (Sandbox Code Playgroud)