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

为何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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 01:15:45