You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 7.0中System.Text.Json反序列化"0.0n"格式值报错解决

解决System.Text.Json反序列化"0.0n"格式值的问题

你遇到的错误本质是$.status.clock字段的JSON类型不固定——有时是包含value和type的对象,有时直接是字符串(比如"0.0n"),而你的POCO类只定义了对象类型的映射,导致反序列化失败。

解决方案:自定义JSON转换器

编写一个JsonConverter<Clock>来兼容两种类型的输入:

using System.Text.Json;
using System.Text.Json.Serialization;

public class ClockConverter : JsonConverter<Clock>
{
    public override Clock Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        // 处理字符串类型的clock值
        if (reader.TokenType == JsonTokenType.String)
        {
            return new Clock
            {
                value = reader.GetString(),
                type = "Big Number" // 可根据业务逻辑设置默认值,或设为null
            };
        }
        // 处理对象类型的clock值
        else if (reader.TokenType == JsonTokenType.StartObject)
        {
            return JsonSerializer.Deserialize<Clock>(ref reader, options);
        }
        
        throw new JsonException($"无法将JSON类型{reader.TokenType}转换为Clock");
    }

    public override void Write(Utf8JsonWriter writer, Clock value, JsonSerializerOptions options)
    {
        // 序列化时默认按对象格式输出,可按需调整
        JsonSerializer.Serialize(writer, value, options);
    }
}

使用转换器

有两种方式启用这个转换器:

  • 方式1:给Clock类添加特性
[JsonConverter(typeof(ClockConverter))]
public class Clock
{
    public string value { get; set; }
    public string type { get; set; }
}
  • 方式2:序列化时配置选项
var options = new JsonSerializerOptions();
options.Converters.Add(new ClockConverter());
var result = JsonSerializer.Deserialize<Status>(yourJsonString, options);

这样无论status.clock是对象还是字符串格式的"0.0n",都能正确反序列化为Clock对象。

内容的提问来源于stack exchange,提问作者seanrco

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 08:06:28