【问题标题】:Deserializing Json to list of objects in C# with Newtonsoft使用 Newtonsoft 将 Json 反序列化为 C# 中的对象列表
【发布时间】:2019-08-15 10:04:15
【问题描述】:

所以我正在努力解析以下 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"
  }
]

我为此创建的类如下所示:

选项.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: 超时获取异常详细信息

【问题讨论】:

  • 试试public Dictionary&lt;string, string&gt; text { get; set; }
  • 如果您将 JSON 粘贴到 json2csharp.com 中,它将为您建议一个数据结构。这可能不是唯一的方法,但它会建议一些可能有效的方法。注: List&lt;string&gt; 在您的代码中似乎不适合“级联”,因为它是 JSON 中的一个数组。

标签: c# json deserialization


【解决方案1】:

您的问题是阅读“文本”对象。 从您的示例中,它包含字符串类型的键/值对。 没有理由在那里使用ICollection,而只能使用Dictionary&lt;string, string&gt;

public class Options
{
    public Dictionary<string, string> text { get; set; }
    public List<string> cascade { get; set; }
    public string val { get; set; }
}

更新: 由于您的示例 JSON 不包含有关 cascade 成员的数据(只有一个空数组),因此将其声明为对象列表 List&lt;object&gt; 可能是安全的。

【讨论】:

  • List&lt;string&gt; cascade 似乎是不可取的,因为它只是 JSON 中的一个空数组——我们不知道它可以包含什么。 List&lt;object&gt; 可能更安全
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-07
  • 2017-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多