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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:53:31