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

时间:2014-02-19 15:37:36

标签: c# arrays json serialization 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; }
}

这是我的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)像List可以从JSON数组反序列化。   JsonArrayAttribute也可以添加到类型中以强制它   从JSON数组反序列化。路径'',第1行,第1位。

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

有任何帮助来解决此错误吗?

6 个答案:

答案 0 :(得分: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"
  }
]

注意:使用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

答案 1 :(得分: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"
   }
]

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

答案 2 :(得分: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;
    }
}

答案 3 :(得分:1)

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

  

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

答案 4 :(得分:0)

这可能是你

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

就这么简单:)

答案 5 :(得分:0)


  

要阅读多个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());
                    }