【问题标题】:JsonConvert.DeserializeObject cannot deserialize valid JSONJsonConvert.DeserializeObject 无法反序列化有效的 JSON
【发布时间】:2018-06-05 21:58:13
【问题描述】:

我很困惑为什么 DeserializeObject 方法不能反序列化有效的 JSON:

string source = JsonConvert.SerializeObject(data.Source);
Maintenance ticket_data = JsonConvert.DeserializeObject<Maintenance>(source); //breaks here

当我到达终点时,我收到以下信息:

"ExceptionMessage": "解析时遇到意外字符 价值: {。路径‘元素’,第 21 行,位置 5。”

我知道发生了什么。 Elements 有很多不同的属性,Elements 是一个数组。

Maintenance 课程中我有:

public IEnumerable<string> Elements { get; set; }

我使用 JSONLint 网站来确保 source 是有效的 JSON,并且确实如此。

Maintenance Class

一些 JSON 输出:

{
  "doc_type": "ticket",
  "updated_date": 12345,
  "ticket_number": "1234",
  "start": 1234,
  "summary": "hello",
  "description": "do stuff",
  "active": true,
  "related_tickets": [],
  "tags": [],
  "elements": [
    {
      "last_updated": 5678,
      "entry_id": null,
      "name": "something",

任何关于我为什么不能反序列化这个 JSON 的见解将不胜感激。

【问题讨论】:

  • 你能发布一个示例 JSON 和类定义,这很难说。
  • 更新了原帖。
  • 这是完全有效的 JSON,但不符合维护类的架构。 “元素”中的项目不是字符串。它们是其他一些复杂的对象。创建另一个对象来表示该事物并在元素定义中使用它,IEnumerable&lt;Element&gt;。如果您并不真正关心获取它的属性,也可以使用 object。
  • 将Elements的类型改为IEnumerable>
  • 只要你有有效的 JSON,不要尝试手工制作要反序列化的类。使用json2csharp.com,它将产生正确的类定义。

标签: c# .net json serialization


【解决方案1】:

错误是由于将 objects 列表反序列化:elements[{}]string 列表strong> 元素:public IEnumerable&lt;string&gt; Elements

您可以做的是创建一个包装器 Elements 类,其属性与 JSON 有效负载匹配,如下所示

 public class Elements {
  public DateTime last_updated {get;set;}
  public int? entry_id {get; set;}
  public string name {get; set;}
 } 

然后在您的Maintenance.cs 中,您可以将Elements 属性更改为

public IEnumerable<Elements> Elements { get; set; }

还要注意 JSON 有效负载中的数据类型。有些不是字符串。例如是last_updated

【讨论】:

  • 这看起来是个不错的方法。早上第一件事就试试!
【解决方案2】:

我认为问题在于您的元素不是像您在对象中定义的那样的字符串数组。从 JSON sn-p 看,您在 elements 数组中有对象。

"elements": [{
      "last_updated": 5678,
      "entry_id": null,
      "name": "something",
}

这定义了一个具有 last_updated、entry_id、name 属性的对象,因此它应该映射到一个类或字典,就像有人在 cmets 中已经建议的那样。

否则它在 JSON 中应该看起来像这样:

"elements": ["string1", "string2", "string3"]

【讨论】:

    【解决方案3】:

    您必须使用 List 或 IEnumerable 的字符串 insted 维护,如下代码:

    var ticket_data = JsonConvert.DeserializeObject<List<string>>(source);
    

    然后设置您的维护类元素 喜欢这段代码

        Elements =ticket_data ;
    

    【讨论】:

    • 但是我需要基于Maintenance类的反序列化
    • 你可以反序列化为一个类。我在整个代码库中有许多类似代码的实例都运行良好。
    • 这个链接解决你的问题:stackoverflow.com/questions/25052293/…
    猜你喜欢
    • 1970-01-01
    • 2020-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多