我试图在不声明C#中每个属性的情况下反序列化JSON。这是JSON的简化摘录:
{
"resourceType": "export",
"type": "search",
"total": 50,
"timestamp": "2020-08-02T18:26:06.747+00:00",
"entry": [
{
"url": "test.com/123",
"resource": {
"resourceType": "Slot",
"id": [
"123"
],
"schedule": {
"reference": {
"value": "testvalue"
}
},
"status": "free",
"start": "2020-08-03T08:30+01:00",
"end": "2020-08-03T09:00+01:00"
}
}
]
}
我想从entry
→resource
,id
和start
中获取值。
关于最佳方法的任何建议吗?
答案 0 :(得分:1)
我在json2sharp方面取得了很好的经验。您可以在此处输入JSON数据,它将为您生成反序列化JSON数据所需的类。
public class Reference
{
public string value { get; set; }
}
public class Schedule
{
public Reference reference { get; set; }
}
public class Resource
{
public string resourceType { get; set; }
public List<string> id { get; set; }
public Schedule schedule { get; set; }
public string status { get; set; }
public string start { get; set; }
public string end { get; set; }
}
public class Entry
{
public string url { get; set; }
public Resource resource { get; set; }
}
public class Root
{
public string resourceType { get; set; }
public string type { get; set; }
public int total { get; set; }
public DateTime timestamp { get; set; }
public List<Entry> entry { get; set; }
}
下一步是选择一个可帮助您反序列化的框架。类似于Newtonsoft JSON。
Root myDeserializedClass = JsonConvert.DeserializeObject<Root>(myJsonResponse);
答案 1 :(得分:0)
我不确定为什么不对序列进行反序列化(即使填充最少),因为无论如何您都必须执行内部类。
这是您通过深入研究JObjects
给予
public class Reference
{
public string value { get; set; }
}
public class Schedule
{
public Reference reference { get; set; }
}
public class Resource
{
public string resourceType { get; set; }
public List<string> id { get; set; }
public Schedule schedule { get; set; }
public string status { get; set; }
public string start { get; set; }
public string end { get; set; }
}
public class Entry
{
public string url { get; set; }
public Resource resource { get; set; }
}
您可以致电
var results = JObject.Parse(input)["entry"]
.Select(x => x.ToObject<Entry>());
答案 2 :(得分:0)
如果要在不声明类的情况下获取数据,则可以使用Json.Net的LINQ-to-JSON API(JToken,JObject等)。您可以将SelectToken
方法与JsonPath表达式一起使用,以几行代码获取所需的内容。请注意,..
是递归下降算子。
JObject obj = JObject.Parse(json);
List<string> ids = obj.SelectToken("..resource.id").ToObject<List<string>>();
DateTimeOffset start = obj.SelectToken("..resource.start").ToObject<DateTimeOffset>();
在这里工作的演示:https://dotnetfiddle.net/jhBzl4
如果事实证明实际上有多个条目,并且您想获取所有条目的id
和start
值,则可以使用如下查询:
JObject obj = JObject.Parse(json);
var items = obj["entry"]
.Children<JObject>()
.Select(o => new
{
ids = o.SelectToken("resource.id").ToObject<List<string>>(),
start = o.SelectToken("resource.start").ToObject<DateTimeOffset>()
})
.ToList();