如何通过Json.NET直接将JSON数组反序列化到自定义对象的属性中?
当然可以实现一步反序列化!
你完全不用绕弯子先手动反序列化成List<Entry>再赋值给Collection的Entries属性——只要稍微调整下Collection类的定义,或者加个自定义转换器,就能一步到位直接调用JsonConvert.DeserializeObject<Collection>(json)完成反序列化。
方法一:自定义JSON转换器(灵活适配复杂场景)
如果你的Collection类还有其他属性,或者需要更精细控制序列化/反序列化逻辑,自定义JsonConverter是最优解:
首先定义你的Entry类(示例):
public class Entry { public int Id { get; set; } public string Name { get; set; } // 你的其他属性 }
然后创建自定义转换器,负责把JSON数组映射到Collection的Entries属性:
public class CollectionConverter : JsonConverter<Collection> { public override Collection ReadJson(JsonReader reader, Type objectType, Collection existingValue, bool hasExistingValue, JsonSerializer serializer) { // 直接将JSON数组反序列化为Entry列表 var entries = serializer.Deserialize<List<Entry>>(reader); // 返回初始化好的Collection对象 return new Collection { Entries = entries }; } public override void WriteJson(JsonWriter writer, Collection value, JsonSerializer serializer) { // 如果需要把Collection序列化为JSON数组,直接序列化Entries即可 serializer.Serialize(writer, value.Entries); } }
最后给Collection类标记上这个转换器:
[JsonConverter(typeof(CollectionConverter))] public class Collection { public List<Entry> Entries { get; set; } // 你的其他属性 }
现在就可以直接调用你想要的代码了:
var coll = JsonConvert.DeserializeObject<Collection>(json);
方法二:利用构造函数标记(简洁轻量)
如果你的需求很简单,只是把JSON数组直接映射到Entries属性,也可以通过标记构造函数来实现:
修改Collection类,添加带List<Entry>参数的构造函数,并标记[JsonConstructor]:
public class Collection { public List<Entry> Entries { get; set; } // 让Newtonsoft.Json识别这个构造函数,用JSON数组作为参数 [JsonConstructor] public Collection(List<Entry> entries) { Entries = entries; } // 如果需要无参构造函数(比如其他业务场景用到),可以保留 public Collection() { } }
这样同样可以直接调用var coll = JsonConvert.DeserializeObject<Collection>(json)完成反序列化,Newtonsoft.Json会自动把JSON数组传入构造函数,赋值给Entries属性。
小提示
两种方法都能完美适配你的JSON数组格式(比如[{"Id":1,"Name":"测试1"},{"Id":2,"Name":"测试2"}]),你可以根据自己的业务复杂度选择合适的方案~
内容的提问来源于stack exchange,提问作者Dawnkeeper
相关产品推荐
相关产品推荐

