无需自定义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
相关产品推荐
相关产品推荐

