反序列化JSON对象会引发Newtonsoft.Json.JsonSerializationException

时间:2016-06-18 06:54:49

标签: c# json

我有这个Json对象:

{
   "Sheet1": [
      {
         "one": 1,
         "two": 18
      },
      {
         "one": 16,
         "two": 33
      },
      {
         "one": 17,
         "two": 34
      }
   ]
}

我正在尝试使用以下模型对其进行反序列化:

public class Sheets
{
    [JsonProperty("Sheet1")]
    public Sheet Sheet { get; set; }
}

public class Sheet
{
    public List<Row> Rows { get; set; }
}

public class Row
{
    [JsonProperty("one")]
    public string Col1 { get; set; }

    [JsonProperty("two")]
    public string Col2 { get; set; }
}

var res = JsonConvert.DeserializeObject<Sheets>(result);

但我得到了这个例外:

  

Newtonsoft.Json.dll中出现未处理的“Newtonsoft.Json.JsonSerializationException”类型异常

     

附加信息:无法将当前JSON数组(例如[1,2,3])反序列化为“ExcelConsoleApp.Sheet”类型,因为该类型需要JSON对象(例如{“name”:“value”})来反序列化正确。

我做错了什么?有什么想法吗?

修改

一种可能的解决方案是使用

dynamic dynamicObject = JsonConvert.DeserializeObject(result);

但我想将它直接反序列化到我的模型中。

4 个答案:

答案 0 :(得分:2)

Sheet1 不是图纸类型,而是行列表。这可以用括号标识。
"Sheet1": [这是集合的明确标志,而不是由{标识的对象。

表格更改为以下内容:

public class Sheets
{
    [JsonProperty("Sheet1")]
    public List<Row> Sheet { get; set; }
}

答案 1 :(得分:2)

这是你需要的模型,我测试了它,它完全按照你的意愿工作。 并且无需更改JSON结构。

public class SheetRoot
{
    [JsonProperty("Sheet1")]
    public List<Row> Sheet { get; set; }
}

public class Row
{
    [JsonProperty("one")]
    public int Col1 { get; set; }

    [JsonProperty("two")]
    public int Col2 { get; set; }
}

var res = JsonConvert.DeserializeObject<SheetRoot>(s);

答案 2 :(得分:0)

如显示错误,您应该使用列表而不是Sheet类。 试试这个:

     {"Sheets" :
       { 
       "Sheet1": [
          {
             "one": 1,
             "two": 18
          },
          {
             "one": 16,
             "two": 33
          },
          {
             "one": 17,
             "two": 34
          }
       ]
     }
    }

答案 3 :(得分:0)

您的结构不兼容。

从JSON推断,示例对象可以被移动为Sheet1[i].oneSheet1[i].twoi是索引。然而,您发布的C#模型将被移动为SheetsObj.Sheet.Row[i].Col1

您可以尝试更改JSON或模型。 所以,也许可以将你的JSON改为

{
    "Sheet1" : {
        "Rows": [
            {
             "one": 1,
             "two": 18
            },
            {
             "one": 16,
             "two": 33
            },
            {
             "one": 17,
             "two": 34
            }
       ]
    }
}