【问题标题】:Cannot deserialize the current JSON array (e.g. [1,2,3])无法反序列化当前 JSON 数组(例如 [1,2,3])
【发布时间】:2014-03-20 01:32:27
【问题描述】:

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

这是我的根对象

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

有什么帮助可以解决这个错误吗?

【问题讨论】:

  • var content 传入DeserializeObject 之前的内容是什么?
  • content 包含 json 的结果,@Dayan
  • 看起来和上面的 JSON 示例完全一样吗?

标签: c# arrays json serialization json.net


【解决方案1】:

我认为您遇到的问题是您的 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 列表,则需要进行迭代。


我继续在控制台应用程序中对此进行了测试,效果很好。

【讨论】:

  • 我已经尝试过,但出现以下错误:无法将类型 'System.Collections.Generic.List 隐式转换为 RootObject。
  • content 有我在上面发布的 JSON 吗?
  • 是的,内容具有您在上面发布的 json。但我认为必须在 Rootobject 类上做点什么
  • 我刚刚使用 Newtonsoft 最新版本在控制台应用程序中测试了您的代码,它运行良好。看看我更新的帖子。
  • 我认为当您的方法定义仍设置为单个 RootObject 时,您仍在尝试返回 RootObjects 列表。因此,public static RootObject GetItems 而不是 public static List&lt;RootObject&gt; GetItems。如果您希望这样做,请确保修改您的方法,或者只是迭代并从您的集合中选择一个对象并返回该对象。希望这有助于澄清一些事情。
【解决方案2】:

这是因为您获得的 json 是您的 RootObject 类的数组,而不是单个实例,请将您的 DeserialiseObject&lt;RootObject&gt; 更改为 DeserialiseObject&lt;RootObject[]&gt; 之类的东西(未经测试)。

然后,您必须更改方法以返回 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 04四个实例。 @Psytronic
【解决方案3】:

你可以用它来解决你的问题:

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 是一个列表,此代码遍历列表以提取项目。完美!
【解决方案4】:

你有一个数组,把它转换成一个对象,比如:

数据:[{“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”}]

【讨论】:

    【解决方案5】:

    这可能是你

    在尝试将您的 json 对象与另一个对象一起使用之前,只需检查 api 是否通过浏览器 api/rootobject 返回原始 json,就我而言,我发现底层数据提供程序 mssqlserver 没有运行并抛出一个未经处理的异常!

    就这么简单:)

    【讨论】:

      【解决方案6】:

      要读取多个 json 提示(数组、属性),我做了以下操作。


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

      改成

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

      【讨论】:

        猜你喜欢
        • 2013-07-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-20
        • 2018-12-30
        相关资源
        最近更新 更多