使用Newtonsoft在C#中将Json反序列化为对象列表

3

我正在努力解析以下JSON字符串。即使在StackOverflow上研究了许多问题后,仍然不得要领。

JSON

[
  {
    "text": {
      "0": "Element 1"
    },
    "cascade": [],
    "val": "1"
  },
  {
    "text": {
      "0": "Element 2"
    },
    "cascade": [],
    "val": "2"
  },
  {
    "text": {
      "0": "Element 3"
    },
    "cascade": [],
    "val": "3"
  },
  {
    "text": {
      "0": "Unknown"
    },
    "cascade": [],
    "val": "0"
  }
]

我创建的这个类看起来像这样:

Options.cs

using System.Collections.Generic;

namespace App.Models
{
  public class Options
  {
    public ICollection<IDictionary<string, string>> text { get; set; }
    public List<string> cascade { get; set; }
    public string val { get; set; }
  }
}

为了运行反序列化,我编写了以下代码:

List<Options> optionList = JsonConvert.DeserializeObject<List<Options>>(inputString);

当我尝试运行代码时,出现以下异常:
Newtonsoft.Json.JsonSerializationException:获取异常详细信息超时。

1
尝试使用 public Dictionary<string, string> text { get; set; } - Renat
2
如果您将JSON粘贴到http://json2csharp.com/中,它会为您建议一个数据结构。这可能不是唯一的方法,但它会建议一些可能有效的内容。请注意,在您的代码中使用`List<string>`似乎不适合“级联”,因为它在JSON中是一个数组。 - ADyson
1个回答

6
您的问题在于读取“text”对象。从您的示例中可以看出,它包含了键/值对,均为字符串类型。因此,没有理由使用ICollection,只需要使用Dictionary<string, string>即可。
public class Options
{
    public Dictionary<string, string> text { get; set; }
    public List<string> cascade { get; set; }
    public string val { get; set; }
}

更新: 由于您提供的样本 JSON 没有包括 cascade 成员的数据(仅为空数组),因此将其声明为对象列表 List<object> 可能是安全的。


1
“List<string> cascade” 看起来不太妥当,因为在 JSON 中它只是一个空数组 - 我们不知道它可能包含什么。使用 “List<object>” 可能更安全。 - ADyson

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