如何遍历Java嵌套数组并为每个元素创建Person模型?
嵌套Person模型转换解决方案
问题说明
需将API返回的无限层级嵌套Persons结构(每个对象包含name、age、children三个字段),转换为对应的PersonModel嵌套结构:每个PersonModel需对应层级的列表,若存在children,则包含对应子层级的PersonModel列表。当前代码仅覆盖第一层嵌套,需通过递归实现完整转换。
示例结构(API返回格式):
{ "Persons": [ {"name": "John", "age": 18, "children": null}, {"name": "Lisa", "age": 32, "children": [{"name": "Tyler", "age": 7, "children": null}]}, {"name": "Mike", "age": 90, "children": [ {"name": "Derek", "age": 50, "children": [ {"name": "Mary", "age":25, "children": null}, {"name": "Beth", "age":16, "children": null} ]} ]} ] }
解决方案:递归转换实现
核心思路是写一个递归转换方法,负责将单个API返回的Person对象转换为PersonModel,同时递归处理其所有子节点。重构后的代码如下:
private void loadPersons(String id) { ListPersonsApi.Request request = Jso.create(); request.id = id; dispatcher.send(ListPersonsApi.PATH, request, r -> { // 转换所有顶层Person,生成对应的PersonModel列表 List<PersonModel> topLevelPersonModels = new ArrayList<>(); for (ListPersonsApi.persons apiPerson : r.persons) { topLevelPersonModels.add(convertToPersonModel(apiPerson)); } // 将顶层列表赋值给目标parent的children parent.children = topLevelPersonModels; }); } // 递归方法:将API返回的Person转换为PersonModel,自动处理嵌套子节点 private PersonModel convertToPersonModel(ListPersonsApi.persons apiPerson) { PersonModel model = new PersonModel(); // 赋值基础属性 model.name = apiPerson.name; model.age = apiPerson.age; // 处理子节点:若存在子列表,递归转换每个子节点 if (apiPerson.children != null && !apiPerson.children.isEmpty()) { List<PersonModel> childModels = new ArrayList<>(); for (ListPersonsApi.persons childApiPerson : apiPerson.children) { childModels.add(convertToPersonModel(childApiPerson)); } model.children = childModels; } else { // 无子节点时设为null,匹配示例结构 model.children = null; } return model; }
代码说明
- 顶层转换:在
loadPersons中遍历API返回的所有顶层Person,调用递归方法生成对应的PersonModel,收集为列表后赋值给目标parent的children。 - 递归核心:
convertToPersonModel完成单个对象的转换:- 先创建
PersonModel并赋值name、age - 若当前对象有
children,则遍历每个子对象,递归调用自身生成子模型,收集后赋值给当前模型的children - 无子节点时将
children设为null,保持和输入结构一致
- 先创建
- 优点:自动适配任意深度的嵌套结构,逻辑清晰,避免了原代码中循环嵌套的混乱逻辑。
内容的提问来源于stack exchange,提问作者Sherbet Head
相关产品推荐
相关产品推荐

