C# 使用特定属性反序列化JSON
我正在尝试反序列化JSON,而不在C#中声明每个属性。以下是JSON的精简摘录:C# 使用特定属性反序列化JSON,c#,json,json.net,C#,Json,Json.net,我正在尝试反序列化JSON,而不在C#中声明每个属性。以下是JSON的精简摘录: { "resourceType": "export", "type": "search", "total": 50, "timestamp": "2020-08-02T18:26:06.747+00:00", "entry&qu
{
"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"
}
}
]
}
我想从条目中获取值→ <代码>资源
,id
和开始
关于最好的方法有什么建议吗?我不知道你为什么不反序列化这个部分(即使它的填充量最小),因为你无论如何都要做内部类 下面是通过深入挖掘
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; }
}
公共类参考
{
公共字符串值{get;set;}
}
公课时间表
{
公共引用{get;set;}
}
公共类资源
{
公共字符串resourceType{get;set;}
公共列表id{get;set;}
公共时间表{get;set;}
公共字符串状态{get;set;}
公共字符串开始{get;set;}
公共字符串结束{get;set;}
}
公开课入学
{
公共字符串url{get;set;}
公共资源资源{get;set;}
}
你可以打电话
var results = JObject.Parse(input)["entry"]
.Select(x => x.ToObject<Entry>());
var results=JObject.Parse(输入)[“条目”]
.Select(x=>x.ToObject());
我在这方面有很好的经验。您可以在那里输入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; }
}
公共类参考
{
公共字符串值{get;set;}
}
公课时间表
{
公共引用{get;set;}
}
公共类资源
{
公共字符串resourceType{get;set;}
公共列表id{get;set;}
公共时间表{get;set;}
公共字符串状态{get;set;}
公共字符串开始{get;set;}
公共字符串结束{get;set;}
}
公开课入学
{
公共字符串url{get;set;}
公共资源资源{get;set;}
}
公共类根
{
公共字符串resourceType{get;set;}
公共字符串类型{get;set;}
公共整数总计{get;set;}
公共日期时间时间戳{get;set;}
公共列表项{get;set;}
}
下一步是选择一个有助于反序列化的框架。差不多
Root myDeserializedClass=JsonConvert.DeserializeObject(myJsonResponse);
如果希望在不声明类的情况下获取数据,可以使用Json.Net(JToken、JObject等)。您可以将该方法与表达式一起使用,以在几行中获得所需的内容。请注意,。
是递归下降运算符
JObject obj = JObject.Parse(json);
List<string> ids = obj.SelectToken("..resource.id").ToObject<List<string>>();
DateTimeOffset start = obj.SelectToken("..resource.start").ToObject<DateTimeOffset>();
演示:只在C#模型中创建所需的属性。“在C#模型中不声明每个属性”,听起来就像手动键入变量名。这是一个简单的复制过去。可以使用联机工具,如,或直接在visual studio中使用简单的特殊过去。对于部分反序列化,您会发现许多基于我有一个属性的示例,如:“div”:“这会导致转换问题。什么问题?如果抛出任何异常,您可以将其发布给我吗?您是否确保有一个有效的json格式?它看起来像json2sharp上的额外“”案例问题。但是,如果我只使用这个属性,也许就可以了?如果你发布整个代码,包括这个属性,我可以尝试进一步帮助你。根据JSON格式,JSON中有“div”:“”是完全有效的。只是json2sharp抱怨代码没有问题。
JObject obj = JObject.Parse(json);
List<string> ids = obj.SelectToken("..resource.id").ToObject<List<string>>();
DateTimeOffset start = obj.SelectToken("..resource.start").ToObject<DateTimeOffset>();
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();