[英]Deserialize a name as a value using Newtonsoft.Json
是否可以将名称反序列化为值?
我有一些 JSON 像这样:
{
"id": "106906",
"data": {
"SER1": {
"events": [
{
"timestamp": "2020-11-11T10:28:40.728600Z",
"type": "high"
}
]
},
"SER2": {
"events": [
{
"timestamp": "2020-11-11T10:28:40.728600Z",
"type": "high"
}
]
}
}
}
我正在使用的 C# 类是这样的:
// Root myDeserializedClass = JsonConvert.DeserializeObject<Root>(myJsonResponse);
public class Event
{
public DateTime timestamp { get; set; }
public string type { get; set; }
}
public class Device
{
public string Id { get; set; }
public List<Event> events { get; set; }
}
public class Data
{
public List<Device> Devices { get; set; }
}
public class Root
{
public string id { get; set; }
public Data data { get; set; }
}
我希望SER1
和SER2
到 map 到List<Device> Devices
Device
设备的Id
分别获得SER1
和SER2
。
这可能吗?
是的,这可以做到,但您需要一个自定义的JsonConverter
来处理它。
首先,你需要对你的类做一个小的调整,因为你有一个额外的层。 JSON 中没有devices
成员——只有data
,它代表设备列表。 因此,将您的根 class 更改为:
public class Root
{
public string Id { get; set; }
[JsonProperty("data"), JsonConverter(typeof(DeviceListConverter))]
public List<Device> Devices { get; set; }
}
您也可以删除Data
class,因为它不是必需的。
这是自定义DeviceListConverter
class 所需的代码:
public class DeviceListConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(List<Device>);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JObject obj = JObject.Load(reader);
return obj.Properties()
.Select(jp => new Device
{
Id = jp.Name,
Events = jp.Value["events"].ToObject<List<Event>>(serializer)
})
.ToList();
}
public override bool CanWrite
{
get { return false; }
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
现在您可以像往常一样反序列化,它应该可以按您的意愿工作:
var root = JsonConvert.DeserializeObject<Root>(json);
这是一个工作演示: https://dotnetfiddle.net/qORiPG
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.