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

C#中使用System.Text.Json处理JSON未知数值类型的技术问询

解决System.Text.Json处理混合类型数值字段的反序列化问题

针对服务器返回的数值字段可能是整数、字符串或混合类型的情况,最简洁通用的方案是自定义Json转换器,在反序列化阶段自动识别并转换类型,无需反复修改实体类。

步骤1:定义目标实体类

实体类的数值字段统一用int类型(根据实际需求也可改为long等),并标记使用自定义转换器:

public class PlayerResponse
{
    public bool Success { get; set; }
    public List<object> Loot { get; set; }
    public List<object> Spawns { get; set; }
    [JsonConverter(typeof(NumberOrStringToIntConverter))]
    public int Energy { get; set; }
    [JsonConverter(typeof(NumberOrStringToIntConverter))]
    public int Xp { get; set; }
    [JsonConverter(typeof(NumberOrStringToIntConverter))]
    public int Mana { get; set; }
    [JsonConverter(typeof(NumberOrStringToIntConverter))]
    public int Power { get; set; }
}

步骤2:实现自定义Json转换器

这个转换器会自动识别JSON值的类型:如果是数字直接转int,如果是字符串则尝试解析为int,完美适配三种返回情况:

public class NumberOrStringToIntConverter : JsonConverter<int>
{
    public override int Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        // 处理数字类型的JSON值
        if (reader.TokenType == JsonTokenType.Number)
        {
            return reader.GetInt32();
        }
        // 处理字符串类型的JSON值
        else if (reader.TokenType == JsonTokenType.String)
        {
            if (int.TryParse(reader.GetString(), out int result))
            {
                return result;
            }
            // 解析失败时的处理,可根据业务需求改为返回默认值(如0)
            throw new JsonException($"无法将字符串 '{reader.GetString()}' 转换为int类型");
        }
        // 不支持的类型直接抛出异常
        throw new JsonException($"不支持的JSON令牌类型: {reader.TokenType}");
    }

    public override void Write(Utf8JsonWriter writer, int value, JsonSerializerOptions options)
    {
        // 序列化时统一输出数字类型
        writer.WriteNumberValue(value);
    }
}

步骤3:执行反序列化

直接调用JsonSerializer.Deserialize即可,转换器会自动处理所有类型情况:

// 全Integer类型JSON反序列化
string intJson = @"
{
    ""success"": true,
    ""loot"": [],
    ""spawns"": [],
    ""energy"": 42,
    ""xp"": 34965,
    ""mana"": 1,
    ""power"": 23
}";
PlayerResponse intResponse = JsonSerializer.Deserialize<PlayerResponse>(intJson);

// 全String类型JSON反序列化
string stringJson = @"
{
    ""success"": true,
    ""loot"": [],
    ""spawns"": [],
    ""energy"": ""42"",
    ""xp"": ""34965"",
    ""mana"": ""1"",
    ""power"": ""23""
}";
PlayerResponse stringResponse = JsonSerializer.Deserialize<PlayerResponse>(stringJson);

// 混合类型JSON反序列化
string mixedJson = @"
{
    ""success"": true,
    ""loot"": [],
    ""spawns"": [],
    ""energy"": ""42"",
    ""xp"": 34965,
    ""mana"": ""1"",
    ""power"": 23
}";
PlayerResponse mixedResponse = JsonSerializer.Deserialize<PlayerResponse>(mixedJson);

补充说明

  • 你之前尝试的if(example.example == int)写法错误,无法直接通过类型比较判断JSON原始值的类型,且这种逻辑应放在反序列化阶段处理,而非反序列化之后。
  • 如果需要处理其他数值类型(如long、float),可以将转换器改为泛型版本,或复制代码修改对应类型即可。
  • 解析失败的分支可根据业务需求调整,比如返回0或其他默认值,避免抛出异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 06:05:23