为何MeasurementsConverter会忽略JsonNumberHandling.AllowReadingFromString配置?
为何自定义
JsonConverter<int>会忽略NumberHandling.AllowReadingFromString配置? 问题场景
尝试将如下单元素JSON数组反序列化为Character记录:
待反序列化的JSON
[ { "name": "Luke Skywalker", "height": "172", "mass": "77", "birth_year": "19BBY", "gender": "male" } ]
Character记录定义
internal record class Character { public string Name { get; init; } = ""; [property: JsonPropertyName("birth_year")] public double Birth { get; init; } public int Height { get; init; } [property: JsonPropertyName("mass")] public int Weight { get; init; } public GenderEnum Gender { get; init; } }
JsonSerializerOptions配置
var options = new JsonSerializerOptions() { PropertyNameCaseInsensitive = true, NumberHandling = JsonNumberHandling.AllowReadingFromString, Converters = { new GenderEnumConverter(), new BirthYearConverter(), new MeasurementsConverter() } };
自定义MeasurementsConverter实现
internal class MeasurementsConverter : JsonConverter<int> { public override int Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { return reader.TryGetInt32(out int result) ? result : -1; } public override void Write(Utf8JsonWriter writer, int value, JsonSerializerOptions options) { writer.WriteStringValue(value.ToString()); } }
异常信息
System.InvalidOperationException: 'Cannot get the value of a token type 'String' as a number.'
异常触发于MeasurementsConverter的Read方法。
反序列化代码
string result = await File.ReadAllTextAsync("people.json"); List<Character> people = JsonSerializer.Deserialize<List<Character>>(result, options);
核心疑问
GenderEnumConverter和BirthYearConverter都能正常工作,但添加MeasurementsConverter后就抛出上述异常。想搞明白为什么自定义的JsonConverter<int>会无视NumberHandling = JsonNumberHandling.AllowReadingFromString这个配置?
注:该JSON来自swapi.dev/api/people,API里部分条目的weight属性值为"unknown",所以需要用这个转换器处理这种特殊情况。
内容的提问来源于stack exchange,提问作者Alexandre Bell
相关产品推荐
相关产品推荐

