JsonConvert.DeserializeObject无法反序列化有效的JSON

时间:2018-06-05 21:58:13

标签: c# .net json serialization

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

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

当我点击我的终端时,我会收到以下内容:

  

&#34; ExceptionMessage&#34;:&#34;解析时遇到意外的字符   价值:{。路径&#39;元素&#39;,第21行,第5位。&#34;

我知道发生了什么。 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的见解将不胜感激。

3 个答案:

答案 0 :(得分:2)

错误是由于将 对象 elements[{}]列表反序列化为 字符串列表元素:public IEnumerable<string> 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

答案 1 :(得分:1)

我认为问题在于你的元素不是像你在对象中定义的一组叮咬。从JSON片段看起来,你在elements数组中有对象。

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

这定义了一个具有属性last_updated,entry_id,name的对象,所以这应该映射到类或字典,就像评论中已经建议的那样。

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

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

答案 2 :(得分:0)

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

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

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

    Elements =ticket_data ;