Java 如何提取JSON对象中值为true的键并生成字符串数组
Java 嵌套JSON提取所有值为true的键实现方案
依赖引入
使用Java生态常用的Jackson JSON处理库实现,Maven项目添加以下依赖:
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.15.2</version> </dependency>
完整实现代码
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; public class TrueKeyExtractor { public static void main(String[] args) throws JsonProcessingException { // 替换为实际JSON字符串 String jsonStr = "{\n" + " \"result\": {\n" + " \"code\": 200,\n" + " \"status\": \"Success\",\n" + " \"messages\": [\n" + " \"Operation completed successfully.\"\n" + " ]\n" + " },\n" + " \"recommendedAction\": \"NA\",\n" + " \"vendorEvaluationReport\": {\n" + " \"bioCatchEvaluation\": {\n" + " \"sessionId\": \"79634aa0-1639-11ec-84b0-db18703348d3\",\n" + " \"score\": 624,\n" + " \"fraudEvaluationResult\": \"tested\",\n" + " \"muid\": \"1624647875970-F12CF03A-9ADC-4C6E-8F3F-6826220B2607\",\n" + " \"threatIndicators\": {\n" + " \"isBot\": false,\n" + " \"isEmulator\": false,\n" + " \"isRat\": false\n" + " },\n" + " \"riskFactors\": {\n" + " \"expertUser\": {\n" + " \"advancedKeyCombo\": true\n" + " },\n" + " \"lowDataFamiliarity\": {\n" + " \"importData\": true\n" + " },\n" + " \"riskyEvent\": {\n" + " \"recentProfileSettingsChange\": true\n" + " }\n" + " },\n" + " \"genuineFactors\": {\n" + " \"genuineLocation\": {\n" + " \"consistentIP\": true\n" + " }\n" + " }\n" + " }\n" + " }\n" + "}"; ObjectMapper objectMapper = new ObjectMapper(); JsonNode rootNode = objectMapper.readTree(jsonStr); List<String> trueKeys = new ArrayList<>(); traverseJson(rootNode, trueKeys); // 输出结果 System.out.println(trueKeys); } /** * 递归遍历JSON节点,收集所有值为true的键 */ private static void traverseJson(JsonNode node, List<String> result) { // 处理对象节点 if (node.isObject()) { Iterator<Map.Entry<String, JsonNode>> fields = node.fields(); while (fields.hasNext()) { Map.Entry<String, JsonNode> entry = fields.next(); String key = entry.getKey(); JsonNode value = entry.getValue(); // 当前值为布尔类型且为true时收集键 if (value.isBoolean() && value.asBoolean()) { result.add(key); } else { // 递归遍历子节点 traverseJson(value, result); } } } // 处理数组节点,兼容数组中嵌套对象的场景 else if (node.isArray()) { for (JsonNode childNode : node) { traverseJson(childNode, result); } } // 其余类型(字符串、数字等)直接跳过 } }
输出结果
运行上述代码后输出的结果与需求完全一致:[advancedKeyCombo, importData, recentProfileSettingsChange, consistentIP]
内容的提问来源于stack exchange,提问作者Praveen Kadri
相关产品推荐
相关产品推荐

