使用Jackson与Map处理JSON时如何遍历嵌套结构数据
你只需要逐层解析嵌套的JSON结构即可,这里提供两种常用的实现方案:
方案1:沿用Map解析逻辑(修改现有代码)
public void storeJsonToMap(List<MultipartFile> file) throws IOException { ObjectMapper objectMapper = new ObjectMapper(); ArrayList<LanguageItem> languageItemList = new ArrayList<>(); Map<String, Object> langMap = objectMapper.readValue(file.get(0).getBytes(), Map.class); // 取顶层lang字段 String language = (String) langMap.get("lang"); // 取data节点,本质是嵌套的Map结构,key为组件名,value为组件下的键值对Map Map<String, Map<String, String>> dataMap = (Map<String, Map<String, String>>) langMap.get("data"); // 遍历所有组件 for (Map.Entry<String, Map<String, String>> componentEntry : dataMap.entrySet()) { String componentName = componentEntry.getKey(); Map<String, String> kvMap = componentEntry.getValue(); // 遍历当前组件下所有键值对 for (Map.Entry<String, String> kvEntry : kvMap.entrySet()) { String key = kvEntry.getKey(); String value = kvEntry.getValue(); // 替换为你实际的SK生成规则 String sk = String.join("_", language, componentName, key); languageItemList.add(new LanguageItem(language, sk, componentName, key, value)); } } // 后续可直接操作languageItemList入库 }
方案2:使用JsonNode解析(更安全,无需强转)
如果担心类型转换异常,推荐使用Jackson的JsonNode API实现遍历:
public void storeJsonToMap(List<MultipartFile> file) throws IOException { ObjectMapper objectMapper = new ObjectMapper(); ArrayList<LanguageItem> languageItemList = new ArrayList<>(); JsonNode rootNode = objectMapper.readTree(file.get(0).getBytes()); // 取lang字段值 String language = rootNode.get("lang").asText(); JsonNode dataNode = rootNode.get("data"); // 遍历data下所有组件节点 var componentIterator = dataNode.fields(); while (componentIterator.hasNext()) { var componentEntry = componentIterator.next(); String componentName = componentEntry.getKey(); JsonNode componentNode = componentEntry.getValue(); // 遍历组件下所有键值对 var kvIterator = componentNode.fields(); while (kvIterator.hasNext()) { var kvEntry = kvIterator.next(); String key = kvEntry.getKey(); String value = kvEntry.getValue().asText(); String sk = String.join("_", language, componentName, key); languageItemList.add(new LanguageItem(language, sk, componentName, key, value)); } } }
内容的提问来源于stack exchange,提问作者Lenzman
相关产品推荐
相关产品推荐

