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

18

我试图读取我的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<RootObject>(content);

    }

但我遇到了这个错误:

无法将当前的JSON数组 (例如 [1,2,3]) 反序列化为类型 'avaris_cash_salepoint.BL.UniqueItemDataRootObject',因为该类型需要一个JSON对象 (例如 {"name":"value"}) 才能正确反序列化。要解决此错误,可以将JSON更改为JSON对象 (例如 {"name":"value"}) 或更改反序列化类型为数组或实现集合接口 (例如 ICollection、IList) 的类型,如可从JSON数组进行反序列化的 List。也可以向类型添加 JsonArrayAttribute 强制其从JSON数组进行反序列化。路径 '', 行 1, 位置 1。

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

有什么方法可以帮助修复这个错误吗?


在传递给DeserializeObject之前,var content的内容是什么? - Dayan
内容包含JSON的结果,@Dayan - Djama
它看起来和你上面的JSON示例完全一样吗? - Dayan
6个回答

33

我认为你遇到的问题是你的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<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);

    }
你需要迭代遍历,如果你不想返回一个RootObject列表。
我已经在控制台应用程序中测试过这个,运行正常。 enter image description here

我已经尝试过了,但是出现了以下错误:无法隐式转换类型'System.Collections.Generic.List'为'RootObject'。 - Djama
content 是否包含我上面发布的JSON数据? - Dayan
是的,内容中包含了您上面发布的JSON。但我认为在Rootobject类上必须进行一些操作。 - Djama
1
我刚刚在控制台应用程序中使用了最新的Newtonsoft测试了你的代码,它运行良好。请查看我的更新帖子。 - Dayan
我认为你仍然尝试返回RootObjects列表,而你的方法定义仍然设置为单个RootObject。因此,应该使用public static RootObject GetItems而不是public static List <RootObject> GetItems。如果你想这样做,请确保修改你的方法,或者只迭代并选择集合中的一个对象并返回该对象。希望这能帮助你澄清一些事情。 - Dayan

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;
    }
}

不错的解决方案。返回的JSON是一个列表,这段代码遍历了列表以提取项目。完美! - Elim Garak

4
这是因为你获取的json是你的RootObject类的数组,而不是单个实例,请将你的DeserialiseObject<RootObject>更改为像DeserialiseObject<RootObject[]>这样的内容(未经测试)。
然后,你必须将方法更改为返回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"
   }
]

你可以看到里面有两个实例。

实例可以不止一个,还有其他参数,例如我有一个实例,或者3个或4个实例。@Psytronic - Djama

1
您有一个数组,需要将其转换为对象,类似于以下内容:

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


0

这可能是你

在尝试使用另一个对象消耗您的json对象之前,请检查API是否通过浏览器api/rootobject返回原始json。对于我的情况,我发现底层数据提供程序mssqlserver未运行并抛出了未处理的异常!

就这么简单 :)


0

为了读取多个 JSON 提示(数组、属性),我采用了以下方法。
var jVariable = JsonConvert.DeserializeObject<YourCommentaryClass>(jsonVariableContent);

change to

var jVariable = JsonConvert.DeserializeObject <List<YourCommentaryClass>>(jsonVariableContent);

由于您无法在foreach循环中使用的方法中看到所有位。例如foreach循环。
foreach (jsonDonanimSimple Variable in jVariable)
                {    
                    debugOutput(jVariable.Id.ToString());
                    debugOutput(jVariable.Header.ToString());
                    debugOutput(jVariable.Content.ToString());
                }

我在这个循环中也遇到了错误,我对其进行了如下更改。
foreach (jsonDonanimSimple Variable in jVariable)
                    {    
                        debugOutput(Variable.Id.ToString());
                        debugOutput(Variable.Header.ToString());
                        debugOutput(Variable.Content.ToString());
                    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接