使用Json.NET将JSON数组转为User对象报错,求助JsonArrayAttribute用法
解决Json.NET无法将JSON数组反序列化为User对象的问题
这个报错的核心原因很直观:你提供的JSON是数组结构(用[]包裹,元素按顺序排列),但User类是一个标准的对象类型——Json.NET默认情况下只会把{}包裹的键值对JSON映射到对象,所以直接转换就会抛出类型不匹配的错误。
报错提示里提到的JsonArrayAttribute是一种解决方案,不过还有更直观的方法,我给你两种可行的实现方式:
方法1:使用[JsonArray]+[JsonProperty(Order)]指定属性顺序
给User类添加[JsonArray]特性,明确告诉Json.NET这个类需要从JSON数组反序列化;再用JsonProperty的Order属性指定每个属性对应数组中的位置(从0开始计数):
using Newtonsoft.Json; [JsonArray] public class User { [JsonProperty(Order = 0)] public string FirstName { get; set; } [JsonProperty(Order = 1)] public string LastName { get; set; } [JsonProperty(Order = 2)] public int Id { get; set; } }
然后执行反序列化代码:
string json = "[\"First\",\"Last\",12345]"; User user = JsonConvert.DeserializeObject<User>(json); // 结果:user.FirstName = "First",user.LastName = "Last",user.Id = 12345
方法2:使用带参数的构造函数+[JsonConstructor](更推荐)
这种方法不需要额外的类特性,而是通过构造函数的参数顺序来匹配JSON数组的元素顺序,可读性更强:
using Newtonsoft.Json; public class User { public string FirstName { get; set; } public string LastName { get; set; } public int Id { get; set; } // 构造函数的参数顺序必须和JSON数组的元素顺序完全一致 [JsonConstructor] public User(string firstName, string lastName, int id) { FirstName = firstName; LastName = lastName; Id = id; } }
同样用JsonConvert.DeserializeObject<User>(json)就能完成转换,效果和方法1一致。
注意事项
- 确保JSON数组的元素类型和
User类对应属性的类型完全兼容,比如你的数组第三个元素是数字12345,User的Id属性就不能定义为string,否则会抛出类型转换错误。 - 两种方法任选其一即可,如果你更倾向于通过属性标记来管理映射关系,选方法1;如果希望代码逻辑更清晰,选方法2。
内容的提问来源于stack exchange,提问作者Lance Tyler
相关产品推荐
相关产品推荐

