我知道有多个线程来回答这个问题,但我的问题没有什么不同

1) 第一个json将值作为双精度类型-

{
  "$type": "SomeType",
  "Mode": "Detailing",
  "form": {
    "value": 0.1
    }
}

2) 第二个json采用表单类型值-

 {
    "$type": "SomeType",
    "Mode": "Detailing",
    "form": {
        "value": {
            "day": 1,
            "month": 5,
            "year": 2025
        }
}

波乔克拉斯wine 店

public class Root{
       [JsonProperty("type")]
        public string type{ get; set; }
        [JsonProperty("mode")]
        public String mode{ get; set; }
        [JsonProperty("form")]
        public Form form{ get; set; }
}

表单类如下所示-

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();
        }
    }

推荐答案

您可以使用这个表单类,而不是自定义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()
    {

    }
}

Csharp相关问答推荐

==和Tuple对象的相等<>

如何使用C#中的主构造函数功能使用多个构造函数?

UWP应用程序try 将打包的本机.exe文件加载为C#程序集

有没有类似于扩展元素的合并元组的语法?

具有可空类型的C#NOTNULL约束具有意外行为

Polly重试URL复制值

在PostgreSQL上使用ExecuteSqlRawAsync的C#11原始字符串文字有区分大小写的问题

Azure函数-在外部启动类中生成配置时出错

Content WithTargetPath实际上是有效的MSBuild项吗?

在平行内使用跨度.用于循环

Visual Studio,Docker容器-容器调用:连接被拒绝

当我手动停止和关闭系统并打开时,Windows服务未启动

我是否应该注销全局异常处理程序

正在try 将自定义字体添加到我的控制台应用程序

C#-如何将int引用获取到byte[]

处理方法内部过滤与外部过滤

.NET8支持Vector512,但为什么向量不能达到512位?

创建在C++可执行文件中使用的C#DLL

Serilog:如何编写只有一个级别的文件

为什么在Web服务中使用异步(&Q)