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

如何在Json.NET 10.0.3中映射命名元素数组至int[]属性?

无需额外类,用Json.NET解析带"id"属性的对象数组到int数组

我懂你这种不想多写冗余类的心情——毕竟就为了个id字段额外定义个类确实有点麻烦,尤其是还受限于SQL Server 2016的限制。其实不用新增类,用Json.NET的自定义转换器就能搞定这个问题。

问题原因

你的Foo类里MyIds是int[]类型,但目标JSON的ids字段是包含id属性的对象数组,Json.NET默认会尝试直接把对象转成int,自然会抛出解析错误。

解决方案:自定义Json转换器

我们可以写一个专门的转换器,把每个带id属性的对象提取出数值,直接转成int数组,无需额外定义类。

1. 实现自定义转换器

public class IdObjectToIntConverter : JsonConverter<int[]>
{
    public override int[] ReadJson(JsonReader reader, Type objectType, int[] existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.Null)
            return null;

        // 读取JSON数组为JArray
        var jArray = JArray.Load(reader);
        // 提取每个对象的"id"值并转为int数组
        return jArray.Select(obj => obj["id"].Value<int>()).ToArray();
    }

    public override void WriteJson(JsonWriter writer, int[] value, JsonSerializer serializer)
    {
        // 可选:如果需要把int数组转回原JSON格式,实现序列化逻辑
        writer.WriteStartArray();
        foreach (var id in value)
        {
            writer.WriteStartObject();
            writer.WritePropertyName("id");
            writer.WriteValue(id);
            writer.WriteEndObject();
        }
        writer.WriteEndArray();
    }
}

2. 给属性添加转换器特性

修改你的Foo类,给MyIds属性加上[JsonConverter]特性:

class Foo
{
    [JsonProperty("ids")]
    [JsonConverter(typeof(IdObjectToIntConverter))]
    public int[] MyIds { get; set; }
}

3. 测试解析

现在再运行你的解析代码,就能正常工作了:

var json = @"{""ids"":[{""id"":1},{""id"":2}]}";
var result = JsonConvert.DeserializeObject<Foo>(json);
// result.MyIds 会得到 [1, 2]

额外说明

这个转换器同时支持反序列化(JSON转对象)和序列化(对象转JSON),如果之后需要把int[]转回原来的对象数组格式,直接调用JsonConvert.SerializeObject(result)就能得到符合要求的JSON。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:33:31