反序列化 JSON 子文档
Posted
技术标签:
【中文标题】反序列化 JSON 子文档【英文标题】:Deserialize JSON subdocument 【发布时间】:2015-12-03 22:37:51 【问题描述】:我正在调用 JIRA Rest API 来接收工作日志对象列表。
我收到的 JSON 看起来像。
"startAt": 0,
"maxResults": 1,
"total": 1,
"worklogs": [
"self": "http://www.example.com/jira/rest/api/2/issue/10010/worklog/10000",
"author":
"self": "http://www.example.com/jira/rest/api/2/user?username=fred",
"name": "fred",
"displayName": "Fred F. User",
"active": false
,
"updateAuthor":
"self": "http://www.example.com/jira/rest/api/2/user?username=fred",
"name": "fred",
"displayName": "Fred F. User",
"active": false
,
"comment": "I did some work here.",
"visibility":
"type": "group",
"value": "jira-developers"
,
"started": "2015-08-25T07:43:10.086+0000",
"timeSpent": "3h 20m",
"timeSpentSeconds": 12000,
"id": "100028"
]
正如我所说,我想把它放在一个列表中。
var json = client.MakeRequest("", password, user);
List<Worklog> myList = JsonConvert.DeserializeObject<List<Worklog>>(json);
它不起作用,因为
"startAt": 0,
"maxResults": 1,
"total": 1,
如何让反序列化程序忽略这些属性? 感谢您的帮助!
【问题讨论】:
【参考方案1】:要么创建一个包含属性的“RootObject”类:
public class RootObject
public int startAt get; set;
public int maxResults get; set;
public int total get; set;
public List<Worklog> worklogs get; set;
并反序列化为:
var rootObject = JsonConvert.DeserializeObject<RootObject>(json);
// access rootObject.worklogs
或者进入解析后的 JSON 并从那里反序列化:
JObject o = JObject.Parse(json);
JToken worklogsJson = o.SelectToken("worklogs");
var worklogs = worklogsJson.ToObject<List<Worklog>>();
【讨论】:
两种方式都会导致 Newtonsoft.Json.JsonReaderException(附加信息:读取字符串时出错。意外令牌:StartObject。路径'worklogs[0].author') 不会发生在我身上。使用您使用的实际 JSON 和类更新您的问题。 使用自写的 Worklog 类而不是(可怕的)Atlassian SDK 中的类,现在它可以工作了。谢谢!以上是关于反序列化 JSON 子文档的主要内容,如果未能解决你的问题,请参考以下文章
使用休眠 jpa 进行 JSON 序列化和反序列化以在 JSON 响应中将父对象转换为子对象
如何让 Json.Net 在不忽略子属性的情况下从 documentDB 序列化/反序列化动态/通用对象?