使用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; } 
}

我希望SER1SER2映射到List<Device> DevicesDeviceId分别得到SER1SER2

这可能吗?

是的,这是可以做到的,但您需要一个自定义的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

相关内容

  • 没有找到相关文章

最新更新