如何在C#中用动态和静态键名反序列化JSON [英] How to deserialize JSON with dynamic and static key names in C#
本文介绍了如何在C#中用动态和静态键名反序列化JSON的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我必须反序列化来自具有以下结构的API的响应:
[
{
"starttime": "...",
"endtime": "....",
"var1": {},
"var2": {}
},
{
"starttime": "...",
"endtime": "....",
"var1": {},
"var3": {}
},
{
"starttime": "...",
"endtime": "....",
"var1": {}
}
]
一些见解:
- JSON是一个对象数组
- 数组中的每个对象都将始终具有"starttime"和"endTime"属性
- 对象"var1"、"var2"、"var3"在其内部将始终具有相同的属性...但问题是对象键(var1、var2或var3)是动态的。它可以是任何字符串,而且这种对象的数量是动态的(我可以有3个或零个"var"对象)。
我的想法是这样的:将JSON字符串反序列化为一个具有属性"starttime"、"endTime"的对象列表和一个包含所有"var"对象的字典。
public class MyResponse
{
[JsonProperty(PropertyName = "starttime")]
public string StartTime { get; set; }
[JsonProperty(PropertyName = "endtime")]
public string EndTime { get; set; }
public Dictionary<string, VarObject> VarData { get; set; }
}
但VarData属性始终为空。
有人尝试过这样的东西吗?
推荐答案
您有两个选择,第一个是直接反序列化为List<Dictionary<string, object>>
,例如:
var responses = JsonConvert.DeserializeObject<List<Dictionary<string, object>>>(json);
或者,如果您坚持使用对象,则需要编写一个自定义转换器。例如,如下所示:
public class MyResponseConverter : JsonConverter
{
public override bool CanConvert(Type type) => type == typeof(MyResponse);
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var responseObject = JObject.Load(reader);
MyResponse response = new MyResponse
{
StartTime = (string)responseObject["starttime"],
EndTime = (string)responseObject["endtime"],
};
var varData = new Dictionary<string, object>();
foreach (var property in responseObject.Properties())
{
if(property.Name == "starttime" || property.Name == "endtime")
{
continue;
}
varData.Add(property.Name, property.Value);
}
response.VarData = varData;
return response;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
// If you want to write to JSON, you will need to implement this method
throw new NotImplementedException();
}
}
您的类将稍微更改为:
[JsonConverter(typeof(MyResponseConverter))]
public class MyResponse
{
[JsonProperty(PropertyName = "starttime")]
public string StartTime { get; set; }
[JsonProperty(PropertyName = "endtime")]
public string EndTime { get; set; }
public Dictionary<string, object> VarData { get; set; }
}
现在您可以这样反序列化:
var responses = JsonConvert.DeserializeObject<List<MyResponse>>(json);
这篇关于如何在C#中用动态和静态键名反序列化JSON的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文