在PowerShell中如何访问嵌套对象的指定子键名称?
解决JSON嵌套层级子键名称获取与ArrayList构建问题
先给出示例JSON数据:
{ "person": { "johndoe": { "family_address": "123 Main St", "children": ["Alice", "Bob"], "years_activity": 5 } } }
实现思路
核心是先定位到person->johndoe层级的JSON对象,再遍历它的所有子键名称,根据子键对应值的类型(是否为复杂结构)决定是否仅将键名加入ArrayList。
方案1:使用org.json库实现
import org.json.JSONObject; import java.util.ArrayList; public class JsonKeyExtractor { public static void main(String[] args) { // 示例JSON字符串 String jsonData = "{\"person\":{\"johndoe\":{\"family_address\":\"123 Main St\",\"children\":[\"Alice\",\"Bob\"],\"years_activity\":5}}}"; // 解析JSON根对象 JSONObject rootObj = new JSONObject(jsonData); // 定位到johndoe层级的对象 JSONObject johnDoeObj = rootObj.getJSONObject("person").getJSONObject("johndoe"); ArrayList<String> keyList = new ArrayList<>(); // 遍历johndoe对象的所有子键 for (String key : johnDoeObj.keySet()) { Object value = johnDoeObj.get(key); // 子键对应值为非复杂类型(非对象、非数组)时,直接加入键名 if (!(value instanceof JSONObject) && !(value instanceof org.json.JSONArray)) { keyList.add(key); } else { // 若子键是复杂结构,按需求仅加入键名(可根据业务扩展处理内部结构) keyList.add(key); } } // 输出结果 System.out.println(keyList); // 输出:[family_address, children, years_activity] } }
方案2:使用Jackson库实现
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import java.util.ArrayList; import java.util.Iterator; import java.util.Map; public class JacksonKeyExtractor { public static void main(String[] args) throws Exception { String jsonData = "{\"person\":{\"johndoe\":{\"family_address\":\"123 Main St\",\"children\":[\"Alice\",\"Bob\"],\"years_activity\":5}}}"; ObjectMapper mapper = new ObjectMapper(); JsonNode rootNode = mapper.readTree(jsonData); // 定位到johndoe层级的节点 JsonNode johnDoeNode = rootNode.path("person").path("johndoe"); ArrayList<String> keyList = new ArrayList<>(); // 遍历子节点的键值对 Iterator<Map.Entry<String, JsonNode>> fieldIterator = johnDoeNode.fields(); while (fieldIterator.hasNext()) { Map.Entry<String, JsonNode> entry = fieldIterator.next(); String key = entry.getKey(); JsonNode value = entry.getValue(); // 判断值是否为简单类型 if (!value.isObject() && !value.isArray()) { keyList.add(key); } else { keyList.add(key); } } System.out.println(keyList); } }
关键说明
- 两种方案的核心都是先定位目标嵌套对象,再通过键集遍历获取子键名称
- 可根据实际业务需求调整复杂类型子键的处理逻辑(比如递归提取内部键名)
- 需确保项目中引入对应JSON库的依赖(如org.json或Jackson Databind)
内容的提问来源于stack exchange,提问作者Ichigo Kurosaki
相关产品推荐
相关产品推荐

