如何使用java在JSON数组中搜索/查找特定单词



我有一个下面的JSON数组从下面,我想得到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"}]

注意:如果你看到JSON数据显示版本字出现2次,显示版本&显示版本日志,但应该只返回显示版本命令数据。

我尝试使用JsonPath:

来执行此操作
List<Map<String, Object>> finalDataList = commandsData.read("$[?(@.command == 'Show Version')]");

但是它给了我下面的错误:

The method parse(String) is undefined for the type JsonPath

指出:

  • JSON解析器库- com. googlcode . JSON -simple

  • commandsData -这是JSON数组

要在数组中找到所需的json对象,需要遍历数组元素并检查它是否包含目标值(如"Show Version")。如果找到了匹配对象,则需要从中提取与"commandResponse"对应的值。

这是如何使用流API实现的(JSONArrayArrayList的子类型,因此我们可以调用stream()):

@SuppressWarnings("unchecked")
public static String getResponse(JSONArray array, String search) {

return (String) array.stream()
.filter(jsonObject -> ((JSONObject) jsonObject).values().stream()
.anyMatch(s1 -> ((String) s1).equalsIgnoreCase(search))
)
.map(jsonObject -> ((JSONObject) jsonObject).get("commandResponse"))
.findFirst()
.orElse("given value doesn't exist"); // apply other methods like orElseThrow() depending on your needs
}

使用例子:

public static void main(String[] args) throws IOException, ParseException {
JSONParser parser = new JSONParser();
String 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"}]";
JSONArray array = (JSONArray) parser.parse(json);
System.out.println(getResponse(array, "Show Version"));
}

输出:

16.0.1

注意:除了非常琐碎的任务外,我不建议将org.json.simple用于任何任务。它非常不灵活,而且不是类型安全的。它的JSONArray扩展了行类型ArrayList因此,到处都是类型强制转换。

对于我来说,将JSONArray映射到Map<String,Object>并在那里实现功能!

下面是我在kotlin上的代码
fun main() {
val 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"}]"
val array = JSONParser().parse(json) as JSONArray
println(findCommandResponseByCommand("show version",array))
}
fun findCommandResponseByCommand(command: String, jsonArray: JSONArray): String {
val found = jsonArray
.map { it as Map<String, Any> }
.find { it["command"] == command }
return found?.get("commandResponse") as? String ?: ""
}

输出为

16.0.1

添加java代码

public class Test {
public static void main(String[] args) throws ParseException {
String 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"}]";
JSONArray array = (JSONArray) new JSONParser().parse(json) ;
System.out.println(findCommandResponseByCommand("show version",array));
}
private static String findCommandResponseByCommand(String command, JSONArray jsonArray) {
Optional result = jsonArray.stream()
.filter(json ->  ((Map<String, Object>) json).get("command").equals(command))
.findAny();
if(result.isPresent()){
return ((Map<String, Object>) result.get()).get("commandResponse").toString();
}
return "";
}
}

您可以考虑另一个库Josson来完成这项工作。

https://github.com/octomix/josson

Josson commandsData = Josson.fromJsonString("[{"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"}]");
String response = commandsData.getString("[command='show version'].commandResponse");
System.out.println(response);

16.0.1

最新更新