如何在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
相关产品推荐
相关产品推荐

