gpt4 book ai didi

C# Newtonsoft JSON - 使用未知对象集合反序列化对象

转载 作者:太空宇宙 更新时间:2023-11-03 14:40:03 24 4
gpt4 key购买 nike

我正在努力使用 newtonsoft.json 对 json 文件进行反序列化.
我要反序列化的对象如下所示:

public class Device
{
public string Name { get; set; }
public int Id { get; set; }
public string Type { get; set; }

public List<Sensor> Sensors { get; }

public bool IsPaired { get; set; }

}

传感器类是虚拟的。
我有多个类继承自 Sensor 类(TemperatureSensor、WaterLevelSensor 等)并添加了一些新属性。这些类的实例存储在 Sensors 集合中。

Json 文件如下所示:

[  
{
"Name":"Device1",
"Id":0,
"Type":"TemperatureSensor",
"Sensors":[
{
"Id":0,
"Type":"TemperatureSensor",
"Data":18.136218099999997,
"ReadIntervalInMiliseconds":5000
},
{
"Id":1,
"Type":"TemperatureSensor",
"Data":18.0999819,
"ReadIntervalInMiliseconds":5000
}
],
"IsPaired":false
},
{
"Name":"Device2",
"Id":1,
"Type":"AutomaticGate",
"Sensors":[
{
"OpenPercentage":0,
"Id":0,
"Type":"AutomaticGate",
"Data":0.0,
"ReadIntervalInMiliseconds":0
}
],
"IsPaired":false
},
{
"Name":"Device3",
"Id":2,
"Type":"Other",
"Sensors":[
{
"IsActive":false,
"Id":0,
"Type":"AirConditioner",
"Data":0.0,
"ReadIntervalInMiliseconds":0
},
{
"Id":1,
"Type":"LightSensor",
"Data":4.0,
"ReadIntervalInMiliseconds":5000
}
],
"IsPaired":false
}
]

我假设我必须从 json 文件中读取传感器的“类型”,并在此基础上创建对象并将其添加到某个集合中,然后使用该集合返回设备类对象。

我正在尝试像这个 blog post 中那样制作自定义 JsonConverter但收效甚微。

最佳答案

您可以创建自定义 JsonConverter 以将 Sensor 对象转换为具体的派生类。以下是此类 JsonConverter 的工作示例:

public class SensorConverter : JsonConverter
{
public override bool CanRead => true;
public override bool CanWrite => false;
public override bool CanConvert(Type objectType)
{
// Don't do IsAssignableFrom tricks here, because you only know how to convert the abstract class Sensor.
return objectType == typeof(Sensor);
}

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var jObject = JObject.Load(reader);
string sensorType = jObject["Type"].Value<string>();
switch (sensorType)
{
case "TemperatureSensor":
return jObject.ToObject<TemperatureSensor>(serializer);
case "AutomaticGate":
return jObject.ToObject<AutomaticGate>(serializer);
case "AirConditioner":
return jObject.ToObject<AirConditioner>(serializer);
case "LightSensor":
return jObject.ToObject<LightSensor>(serializer);
default:
throw new NotSupportedException($"Sensor type '{sensorType}' is not supported.");
}
}

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) => throw new NotImplementedException();
}

然后,在反序列化时,您必须将自定义转换器添加到设置中才能使其正常工作。

请注意,您的 Sensors 属性目前是只读的。您必须提供一个 setter 以便 NewtonSoft 填充该属性。

关于C# Newtonsoft JSON - 使用未知对象集合反序列化对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57478056/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com