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

如何用Newtonsoft JSON将数组JSON的acf部分反序列化为List<Acf>

需求:提取JSON数组中所有"acf"内容到List

我有如下简化后的JSON数组(原JSON包含更多元素),需要把每个元素里的"acf"字段内容提取出来,存入List<Acf>集合中。

JSON示例

[{
    "id": 26,
    "date": "2023-08-30T18:36:24",
    "date_gmt": "2023-08-30T18:36:24",  
    "acf": {
        "name": "John",
        "lastName": "Smith",
        "age": "33"     
    }
}, {
    "id": 20,
    "date": "2023-06-11T11:17:02",
    "date_gmt": "2023-06-11T11:17:02",
    "acf": {
        "name": "Randy",
        "lastName": "Jones ",
        "age": "22"     
    }
},
{
    "id": 20,
    "date": "2023-06-11T11:17:02",
    "date_gmt": "2023-06-11T11:17:02",
    "acf": {
        "name": "Mark",
        "lastName": "Taylor ",
        "age": "56" 
    }       
}]

已定义的Acf类

public class Acf
{
    public string name { get; set; }
    public string lastName { get; set; }
    public string age { get; set; }
}

当前实现(希望简化)

[System.Serializable]
public class Acf
{
    public string name { get; set; }
    public string lastName { get; set; }
    public string age { get; set; }
}

private List<Acf> _acfList = new List<Acf>();

void PrepareAcfData(string json)
{
    JArray data = JArray.Parse(json);

    for (int i = 0; i < data.Count; i++)
    {
        Acf newAcf = new Acf();
        
        newAcf.name = data[i]["acf"]["name"].Value<string>();
        newAcf.lastName = data[i]["acf"]["lastName"].Value<string>();
        newAcf.lastName = data[i]["acf"]["age"].Value<int>(); // 此处存在bug:误将age值赋值给lastName
        
        _acfList.Add(newAcf);
    }
}

简化实现方案

方案1:通过临时类直接反序列化(最简洁)

定义一个匹配JSON结构的临时类,直接反序列化整个数组后提取acf字段,无需手动赋值:

// 临时类,仅用于匹配JSON的结构
public class TempItem
{
    public Acf acf { get; set; }
}

private List<Acf> _acfList = new List<Acf>();

void PrepareAcfData(string json)
{
    // 反序列化整个JSON数组到临时对象列表
    var tempItems = JsonConvert.DeserializeObject<List<TempItem>>(json);
    // 提取所有acf元素到目标列表
    _acfList = tempItems.Select(item => item.acf).ToList();
}

方案2:用LINQ简化JArray遍历

如果不想定义临时类,可以直接借助LINQ和ToObject<Acf>()方法,省去手动循环赋值的步骤:

private List<Acf> _acfList = new List<Acf>();

void PrepareAcfData(string json)
{
    JArray data = JArray.Parse(json);
    // 遍历每个元素,将acf节点直接转换为Acf对象并收集到列表
    _acfList = data.Select(item => item["acf"].ToObject<Acf>()).ToList();
}

补充:修复原代码的bug

原代码中有个明显错误:将age的值错误赋值给了lastName,同时age字段是string类型,不应使用Value<int>(),正确写法应为:

newAcf.age = data[i]["acf"]["age"].Value<string>();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 07:05:32