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

无需自定义JsonConverter,能否将Json.Number/Json.String反序列化为string?

兼容数字/字符串类型的JSON反序列化解决方案

针对你遇到的JSON中value属性既可以是字符串也可以是数字,要反序列化为C#记录的string类型字段的问题,除了自定义JsonConverter,还有以下几种可行方法:

方法1:用JsonElement做中间转换(System.Text.Json)

把记录里的StatusValue字段替换为JsonElement类型,再通过计算属性转为字符串。这种方式类型安全,无额外性能开销:

public record StatusMessage(
    [property: JsonPropertyName("event_type")] string EventType, 
    [property: JsonPropertyName("value")] JsonElement ValueElement)
{
    // 自动适配数字/字符串,转成对应字符串格式
    public string StatusValue => ValueElement.ToString();
}

反序列化时直接调用JsonSerializer.Deserialize<StatusMessage>(json)即可,数字-253会被转成"-253",字符串"ok"保持原样。

方法2:object类型中转(System.Text.Json)

将目标字段先定义为object,再通过计算属性转成字符串。这种写法简单直观,但会存在装箱拆箱的性能开销:

public record StatusMessage(
    [property: JsonPropertyName("event_type")] string EventType, 
    [property: JsonPropertyName("value")] object RawValue)
{
    public string StatusValue => RawValue?.ToString() ?? string.Empty;
}

反序列化时,数字会被解析成int/long等数值类型,字符串则保持string类型,最后统一通过ToString()转为字符串输出。

方法3:切换到Newtonsoft.Json(Json.NET)

如果项目允许更换JSON库,Newtonsoft.Json默认支持把数字反序列化为字符串类型,原记录代码完全不用修改,只需替换特性和反序列化方法:

public record StatusMessage(
    [JsonProperty("event_type")] string EventType, 
    [JsonProperty("value")] string StatusValue)

反序列化时调用:

var message = JsonConvert.DeserializeObject<StatusMessage>(json);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 20:55:17