C# 使用变量属性名反序列化JSON
我想将json从 与此类似:C# 使用变量属性名反序列化JSON,c#,json,json.net,C#,Json,Json.net,我想将json从 与此类似: { "BW": { "Neujahrstag": { "datum": "2017-01-01", "hinweis": "" }, "Heilige Drei K\u00f6nige": { "datum": "2017-01-06", "hinweis": "" }, "Gr\u00fcndonnerstag": { "datum": "201
{
"BW": {
"Neujahrstag": {
"datum": "2017-01-01",
"hinweis": ""
},
"Heilige Drei K\u00f6nige": {
"datum": "2017-01-06",
"hinweis": ""
},
"Gr\u00fcndonnerstag": {
"datum": "2017-04-13",
"hinweis": "Gem\u00e4\u00df \u00a7 4 Abs. 3 des Feiertagsgesetzes von Baden-W\u00fcrttemberg[10] haben Sch\u00fcler am Gr\u00fcndonnerstag und am Reformationstag schulfrei. In der Regel legt das Kultusministerium die Ferientermine so fest, dass diese beiden Tage in die Osterferien bzw. in die Herbstferien fallen."
},
"Karfreitag": {
"datum": "2017-04-14",
"hinweis": ""
}
},
"BY": {
"Neujahrstag": {
"datum": "2017-01-01",
"hinweis": ""
},
"Heilige Drei K\u00f6nige": {
"datum": "2017-01-06",
"hinweis": ""
}
}
}
我想反序列化如下:
public class Root
{
public State[] States { get; set; }
}
public class State
{
public Holiday[] Holidays { get; set; }
}
public class Holiday
{
public DateTime Date { get; set; }
public string Note { get; set; }
}
但由于物业名称不固定,我无法做到这一点
我也尝试过使用JObject.Parse(),但这对我没有多大帮助
有什么办法吗?如果您将模型修改为:
public class Root : Dictionary<string, State> { }
public class State : Dictionary<string, Holiday> { }
public class Holiday {
[JsonProperty(PropertyName = "datum")]
public DateTime Date { get; set; }
[JsonProperty(PropertyName = "hinweis")]
public string Note { get; set; }
}
公共类根目录:字典{}
公共类状态:字典{}
公休假日{
[JsonProperty(PropertyName=“datum”)]
公共日期时间日期{get;set;}
[JsonProperty(PropertyName=“hinweis”)]
公共字符串注释{get;set;}
}
您可以使用以下命令反序列化:
var root = JsonConvert.DeserializeObject<Root>(str);
var firstBwHoliday = root["BW"]?["Neujahrstag"].Date;
var root=JsonConvert.DeserializeObject(str);
var firstBwHoliday=根[“BW”]?[“Neujahrstag”]。日期;
首先更新假日
以处理属性名称
public class Holiday {
[JsonProperty("datum")]
public DateTime Date { get; set; }
[JsonProperty("hinweis")]
public string Note { get; set; }
}
接下来要反序列化到嵌套字典
var rawRoot = JsonConvert.DeserializeObject<Dictionary<string, Dictionary<string, Holiday>>>(json);
但是,您确实松开了键,因为它们不是最终模型的一部分。嵌套的字符串和假日字典“但这对我没有多大帮助。”-详细说明。@AluanHaddad我无法访问属性并从中填充我的结构。@Nkosi遗憾的是
反序列化对象
即使使用嵌套词典也会返回null
。请注意,原始源代码的日期类似于“0-01-06”,Json.NET将无法解析为DateTime
。
var root = new Root {
States = rawRoot.Select(stateKvp => new State() {
Holidays = stateKvp.Value.Select(holidayKvp => holidayKvp.Value).ToArray()
})
.ToArray()
};