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

如何将JSON中的整数反序列化为字符串?(System.Text.Json场景)

解决方案

有两种常用方式可以实现将JSON整数反序列化为字符串的需求,以下结合你的源生成上下文代码进行说明:

方法一:自定义转换器并绑定到目标属性

  1. 先创建一个自定义JSON转换器,专门处理数字到字符串的反序列化逻辑:
public class NumberToStringConverter : JsonConverter<string>
{
    public override string Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        // 处理JSON中的数字类型(整数、浮点数)
        if (reader.TokenType == JsonTokenType.Number)
        {
            return reader.GetInt64().ToString();
            // 若需支持浮点数转换,可替换为 reader.GetDouble().ToString()
        }
        // 兼容原本就是字符串的JSON字段
        else if (reader.TokenType == JsonTokenType.String)
        {
            return reader.GetString();
        }
        // 其他不支持的类型抛出异常,也可根据需求返回默认值
        throw new JsonException("无法将当前JSON值转换为字符串类型");
    }

    public override void Write(Utf8JsonWriter writer, string value, JsonSerializerOptions options)
    {
        // 序列化时默认输出为字符串,若需要将合法数字字符串转回数字输出,可自行扩展逻辑
        writer.WriteStringValue(value);
    }
}
  1. 将该转换器绑定到OrderInfo的UserReference属性上:
public partial class OrderInfo
{
    [JsonConverter(typeof(NumberToStringConverter))]
    public string UserReference { get; set; }
}

修改完成后,JSON中的数字123会被自动转换为字符串"123"赋值给UserReference。

方法二:在源生成上下文全局配置转换器

如果多个属性都需要数字转字符串的处理,可以直接在上下文层面全局配置转换器:

  1. 先创建上述的NumberToStringConverter类。
  2. 修改OrderInfoContext的特性配置:
[JsonSerializable(typeof(OrderInfo), GenerationMode = JsonSourceGenerationMode.Metadata)]
[JsonSourceGenerationOptions(Converters = new[] { typeof(NumberToStringConverter) })]
public partial class OrderInfoContext : JsonSerializerContext
{ }

这种方式会让上下文处理的所有string类型属性,都自动应用数字转字符串的反序列化逻辑。

验证效果

修改后运行代码,可通过打印验证结果:

Console.WriteLine(s.UserReference); // 输出 "123"
Console.WriteLine(s.UserReference.GetType()); // 输出 System.String

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 17:33:25