将json反序列化为pojo,其中json字段具有不同的数据类型C#
Deserializejson to pojo where json field has different data types C#
我知道有多个线程在回答这个问题,但我的问题略有不同
下面是我正在使用的 classes 和 json。
如何处理具有不同数据类型对象和双精度值的相同 属性 的反序列化。
这是我尝试过的 - JSON 的 2 个样本:
1)第一个json取值为double类型-
{
"$type": "SomeType",
"Mode": "Detailing",
"form": {
"value": 0.1
}
}
2) 第二个 json 采用值类型值-
{
"$type": "SomeType",
"Mode": "Detailing",
"form": {
"value": {
"day": 1,
"month": 5,
"year": 2025
}
}
POJO 类
我创建了一个根 class 如下-
public class Root{
[JsonProperty("type")]
public string type{ get; set; }
[JsonProperty("mode")]
public String mode{ get; set; }
[JsonProperty("form")]
public Form form{ get; set; }
}
表格class如下-
public class Form{
[JsonProperty("value")]
private Value myValue { get; set; }
}
public class Value
{
[JsonProperty("day")]
private int day { get; set; }
[JsonProperty("month")]
private int month { get; set; }
[JsonProperty("year")]
private int year { get; set; }
}
我正在使用 JsonConverter 反序列化 json 对象中的值
public class Resolver : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return typeof(Root).IsAssignableFrom(objectType);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JObject item = JObject.Load(reader);
if (item["form"]["value"].Type == JTokenType.Float)
{
//how to handle double type?
}
else if (item["form"]["value"].Type == JTokenType.Object)
{
return item.ToObject<Root>();
}
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
您可以使用此表单 class 而不是自定义 json 转换器
var data = JsonConvert.DeserializeObject<Data>(json);
public class Form
{
[JsonIgnore]
public double myValueDouble { get; set; }
[JsonIgnore]
public Value myValue { get; set; }
[JsonConstructor]
public Form(JToken value)
{
if (value is JValue) myValueDouble = value.ToObject<double>();
else myValue=(Value) value.ToObject<Value>();
}
public Form()
{
}
}
我知道有多个线程在回答这个问题,但我的问题略有不同 下面是我正在使用的 classes 和 json。 如何处理具有不同数据类型对象和双精度值的相同 属性 的反序列化。 这是我尝试过的 - JSON 的 2 个样本:
1)第一个json取值为double类型-
{
"$type": "SomeType",
"Mode": "Detailing",
"form": {
"value": 0.1
}
}
2) 第二个 json 采用值类型值-
{
"$type": "SomeType",
"Mode": "Detailing",
"form": {
"value": {
"day": 1,
"month": 5,
"year": 2025
}
}
POJO 类 我创建了一个根 class 如下-
public class Root{
[JsonProperty("type")]
public string type{ get; set; }
[JsonProperty("mode")]
public String mode{ get; set; }
[JsonProperty("form")]
public Form form{ get; set; }
}
表格class如下-
public class Form{
[JsonProperty("value")]
private Value myValue { get; set; }
}
public class Value
{
[JsonProperty("day")]
private int day { get; set; }
[JsonProperty("month")]
private int month { get; set; }
[JsonProperty("year")]
private int year { get; set; }
}
我正在使用 JsonConverter 反序列化 json 对象中的值
public class Resolver : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return typeof(Root).IsAssignableFrom(objectType);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JObject item = JObject.Load(reader);
if (item["form"]["value"].Type == JTokenType.Float)
{
//how to handle double type?
}
else if (item["form"]["value"].Type == JTokenType.Object)
{
return item.ToObject<Root>();
}
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
您可以使用此表单 class 而不是自定义 json 转换器
var data = JsonConvert.DeserializeObject<Data>(json);
public class Form
{
[JsonIgnore]
public double myValueDouble { get; set; }
[JsonIgnore]
public Value myValue { get; set; }
[JsonConstructor]
public Form(JToken value)
{
if (value is JValue) myValueDouble = value.ToObject<double>();
else myValue=(Value) value.ToObject<Value>();
}
public Form()
{
}
}