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

