是否可以将名称反序列化为值?
我有一些类似的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
映射到List<Device> Devices
,Device
的Id
分别得到SER1
和SER2
。
这可能吗?
是的,这是可以做到的,但您需要一个自定义的JsonConverter
来处理它。
首先,你需要对你的类做一个小的调整,因为你有一个额外的层。JSON中没有devices
成员——只有data
,它表示设备列表。因此,将您的根类更改为:
public class Root
{
public string Id { get; set; }
[JsonProperty("data"), JsonConverter(typeof(DeviceListConverter))]
public List<Device> Devices { get; set; }
}
您也可以去掉Data
类,因为它不是必需的。
以下是自定义DeviceListConverter
类所需的代码:
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