JSON反序列化时无法将int转为string,自定义转换器不生效问题求助
问题根源
- 序列化库不匹配:你编写的
IntToStringConverter继承自Newtonsoft.Json.JsonConverter,属于Newtonsoft.Json(Json.NET)库的API,但你代码里反序列化用的是System.Text.Json.JsonSerializer(微软官方原生序列化库),两套库的转换器特性、配置逻辑完全不互通,所以自定义转换器完全不会被触发,断点自然无法进入。 - 转换器逻辑错误:即便你切换为Newtonsoft.Json做序列化,你重写的
ReadJson方法直接抛出NotImplementedException,自己实现的IntToString方法没有被调用,也会报错。 - NumberHandling配置错误:你设置的
JsonNumberHandling.WriteAsString是序列化输出时将数字转为字符串,要实现反序列化时自动将JSON数字转为C# string属性,需要配置的是JsonNumberHandling.AllowReadingFromString。
解决方案
方案1:无需自定义转换器,直接调整System.Text.Json配置(最简方案)
修改你的_serializerOptions配置,调整NumberHandling参数即可实现自动将JSON数字映射到string类型属性:
_serializerOptions = new JsonSerializerOptions() { PropertyNamingPolicy = null, // 仅反序列化需求可单独加AllowReadingFromString,同时需要序列化输出数字为字符串可保留WriteAsString NumberHandling = JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString, };
配置生效后直接去掉属性上的[JsonConverter(typeof(IntToStringConverter))]特性即可,该特性是Newtonsoft.Json的API,System.Text.Json不会识别。
方案2:自定义System.Text.Json版本转换器(适配复杂转换逻辑)
如果你有更特殊的转换规则,需要自定义转换逻辑,需要继承System.Text.Json.Serialization.JsonConverter<T>实现转换器:
using System.Text.Json; using System.Text.Json.Serialization; namespace CrownData.DataInteractionLayer.DanishCrown.Models { public class IntToStringConverter : JsonConverter<string> { public override string Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType == JsonTokenType.Null) { return null; } if (reader.TokenType == JsonTokenType.String) { return reader.GetString(); } if (reader.TokenType == JsonTokenType.Number) { // 可根据数值范围替换为GetInt64、GetDecimal等方法适配场景 return reader.GetInt32().ToString(); } throw new JsonException($"解析字符串时遇到意外token类型:{reader.TokenType}"); } public override void Write(Utf8JsonWriter writer, string value, JsonSerializerOptions options) { // 直接输出字符串即可,需要序列化时转回数字可自行加类型判断逻辑 writer.WriteStringValue(value); } } }
注册转换器两种方式二选一即可:
- 单独给属性加特性(注意引用System.Text.Json的命名空间,不要引用Newtonsoft.Json的对应类):
public class StemDataReadDTO { [JsonConverter(typeof(IntToStringConverter))] public string Hovednummer { get; set; } public EjerStem Ejer { get; set; } } - 全局注册到序列化选项:
_serializerOptions = new JsonSerializerOptions() { PropertyNamingPolicy = null, Converters = { new IntToStringConverter() } };
内容的提问来源于stack exchange,提问作者TSS
相关产品推荐
相关产品推荐

