如何在Java中从JSON数组精准查询指定Command对应的commandResponse
问题:根据指定Command值获取对应commandResponse
需求说明
- 从给定JSON数组中,根据精确匹配的
command值(区分大小写和完整指令,比如show version与show version log为不同指令),获取对应的commandResponse值。 - 示例:匹配
show version时,应返回16.0.1。
目标JSON数组
[{"commandResponse":"","errorMessage":"harddisk crash not applicable.","name":"harddiskcrash","command":"harddiskcrash","status":"NotApplicable"},{"commandResponse":"","errorMessage":"stby-harddisk crash not applicable.","name":"stby-harddiskcrash","command":"stby-harddiskcrash","status":"NotApplicable"},{"commandResponse":"16.0.1","errorMessage":"_showconfigall not applicable.","name":"show_version","command":"show version","status":"NotApplicable"},{"commandResponse":"","errorMessage":"_showpolicy-map not applicable.","name":"_showpolicy-map","command":"_showpolicy-map","status":"NotApplicable"},{"commandResponse":"","errorMessage":"system dirvarlog not applicable.","name":"show version log","command":"show version log","status":"NotApplicable"}]
当前尝试与错误
尝试用JsonPath实现时,编写了以下代码:
List<Map<String, Object>> finalDataList = commandsData.read("$[?(@.command == 'Show Version')]");
触发错误:
The method parse(String) is undefined for the type JsonPath
注:当前使用的JSON解析库为com.googlecode.json-simple,commandsData为已解析的JSON数组对象。
解决方案
方案1:基于现有json-simple库实现
无需引入额外依赖,直接遍历JSON数组完成精确匹配:
import org.json.simple.JSONArray; import org.json.simple.JSONObject; // 假设commandsData是已加载好的JSONArray对象 String targetCommand = "show version"; String commandResponse = ""; for (Object obj : commandsData) { JSONObject commandObj = (JSONObject) obj; String cmd = (String) commandObj.get("command"); if (targetCommand.equals(cmd)) { commandResponse = (String) commandObj.get("commandResponse"); break; // 找到匹配项后终止遍历 } } // 输出结果 System.out.println(commandResponse); // 输出16.0.1
该方案优势:
- 适配当前使用的json-simple库,无额外依赖
- 严格区分指令大小写与完整字符串,完全满足需求
方案2:正确使用JsonPath(若需切换依赖)
若要使用JsonPath,需修正依赖与代码写法:
- 引入正确的JsonPath依赖(如
com.jayway.jsonpath:json-path),替代json-simple - 修正代码逻辑:注意JsonPath的调用方式,以及大小写敏感匹配(原代码中
'Show Version'与目标指令大小写不一致,需修正)
示例代码:
import com.jayway.jsonpath.JsonPath; import java.util.List; import java.util.Map; // 假设jsonString是原始JSON数组的字符串形式 String jsonString = "[{\"commandResponse\":\"\",\"errorMessage\":\"harddisk crash not applicable.\",\"name\":\"harddiskcrash\",\"command\":\"harddiskcrash\",\"status\":\"NotApplicable\"},...]"; String targetCommand = "show version"; // 精确匹配command值,保持大小写一致 List<Map<String, Object>> result = JsonPath.read(jsonString, "$[?(@.command == '" + targetCommand + "')]"); if (!result.isEmpty()) { String response = (String) result.get(0).get("commandResponse"); System.out.println(response); // 输出16.0.1 }
内容的提问来源于stack exchange,提问作者Garry S
相关产品推荐
相关产品推荐

