使用特定属性反序列化 JSON



我正在尝试反序列化JSON,而不声明C#中的每个属性。 以下是 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"
}
}
]
}

我想从entryresourceidstart中获取值。

关于最佳方法的任何建议?

我用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);

如果你想在不声明类的情况下获取数据,你可以使用 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();

演示:https://dotnetfiddle.net/Qe8NB7

我不确定你为什么不反序列化这个批次(即使它是最少填充的),因为无论如何你都必须做内部类。

以下是通过深入研究JObjects来绕过某些类 (1) 的方法

鉴于

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>());

最新更新