我很困惑为什么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,而且确实如此。
一些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的见解将不胜感激。
答案 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 ;