反序列化 JSON 对象时出现 Newtonsoft.Json.JsonSerializationException 异常

8

I have this Json object:

{
   "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.JsonSerializationException' 发生在 Newtonsoft.Json.dll 中

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

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

编辑

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

dynamic dynamicObject = JsonConvert.DeserializeObject(result);

但我希望能够直接将其反序列化到我的模型中。

4个回答

3

Sheet1 不是一个 Sheet 类型,而是一组行的列表。这可以通过方括号来识别。
例如 "Sheet1": [ 这是一个明显的集合标志,而不是由 { 标识的对象。

请将 Sheets 更改为以下内容:

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

没问题,请注意我会更改List<Row> Sheet属性以使其更准确,例如改为List<Row> Rows - Orel Eraki

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

谢谢你的回答Hakam,看起来很不错,但我不确定为什么会出现“Newtonsoft.Json.JsonReaderException类型的未处理异常,在Newtonsoft.Json.dll中发生”。 - Yar
@HoomanYar 我更新了答案,使类和属性的名称更好。我无法弄清楚为什么旧代码在您的机器上会产生异常,因为在我的机器上它可以正常工作且结果正确。 - Hakan Fıstık
在进行类命名更改后,我知道我的答案非常类似于被接受的答案,但我并没有打算这样做。 - Hakan Fıstık

0

根据错误提示,您应该使用列表而不是Sheet类。 请尝试这样做:

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

好的,谢谢,但那是一个不同的JSON对象,与我所拥有的不同。 - Yar
你也可以在这个语句中更改你的类:var res = JsonConvert.DeserializeObject<Sheet>(result); - Siamak Ferdos
这其实就是问题所在。使用那段代码会返回 null 结果,因为 Sheet 就像是它的内部对象。 - Yar

0

您的结构不兼容。

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

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

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

1
没问题,但是 Hakam Fostok 的回答应该可以解决这个问题。 - Nikhil Girraj

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