使用特定属性反序列化JSON

时间:2020-08-05 06:33:04

标签: c# json json.net

我试图在不声明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"
            }
        }
   ]
}

我想从entryresourceidstart中获取值。

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

3 个答案:

答案 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

来绕过某些类(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>());

答案 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

如果事实证明实际上有多个条目,并且您想获取所有条目的idstart值,则可以使用如下查询:

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