将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()
    {

    }
}