如何使用sql或嵌套动态条件过滤java中列表中的数据列表
如何使用java动态过滤数据,假设我们有map/json数组的数据列表,而没有pojo映射 [ { id:1001, 类型:内部, 状态:关闭 }, { id:1002, 类型:外部, 状态:关闭 }, { 身份证号码:1003, 类型:内部, 状态:打开 }, { 身份证号码:1004, 类型:内部, 状态:打开 } ] 现在,我们需要输出id>1001的过滤数据,并键入:“外部”或状态:“打开” [ { id:1002, 类型:外部, 状态:关闭 }, { 身份证号码:1003, 类型:内部, 状态:打开 }, { 身份证号码:1004, 类型:内部, 状态:打开 } ]如何使用sql或嵌套动态条件过滤java中列表中的数据列表,java,json,lambda,filter,predicate,Java,Json,Lambda,Filter,Predicate,如何使用java动态过滤数据,假设我们有map/json数组的数据列表,而没有pojo映射 [ { id:1001, 类型:内部, 状态:关闭 }, { id:1002, 类型:外部, 状态:关闭 }, { 身份证号码:1003, 类型:内部, 状态:打开 }, { 身份证号码:1004, 类型:内部, 状态:打开 } ] 现在,我们需要输出id>1001的过滤数据,并键入:“外部”或状态:“打开” [ { id:1002, 类型:外部, 状态:关闭 }, { 身份证号码:1003, 类型:内
如何实现这一目标,有什么建议吗?您可以通过以下方法实现这一目标:- 将json转换为字符串 构造JSONArray>>JSONArray JSONArray=新的JSONArrayconverted_json_字符串 从JsonArray中拉出jsonArrayObject并构造一个列表 使用Collections.sort方法并在其中的JSON键上部署比较逻辑 并构造排序后的json。
试试这段代码,我假设你有一个对象列表
List<YourCLass> filteredList = list
.stream()
.filter(obj -> obj.getId() > 1001 && (obj.getStatus().equals("Open") || obj.getType().equals("External")))
.collect(Collectors.toList());
在pom.xml中添加此依赖项,或下载库并将其添加到库中
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
使用JSON路径,下面是我作为示例发布的几个JSONPath查询
注意:-对于操作>或我们可以使用javascript功能来解决条件,URID应该是Integer类型。我们可以使用Java ScriptEngineManager运行javascript表达式: 表达式可以是type='Internal'和status='Open' 私有字符串getResultString表达式{ ScriptEngineManager管理器=新ScriptEngineManager; ScriptEngine=manager.getEngineByNameJavaScript; 试一试{ 返回engine.evalexpression.toString; }捕获异常e{ } 返回null;
}我说我很困惑,你想从原始json中提取数据吗?从对象列表中选择对象的数据库?您尝试了什么?您在哪里遇到了问题?@S\R已经发布了一个答案,看看这是否是您所要求的。需要在没有POJO映射的情况下实现这一点。有可能的话,试试这个。这就是解决方案。
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
public static void main(String[] args) {
String jsonData = "[\r\n" +
" {\r\n" +
" \"id\": 1001,\r\n" +
" \"type\": \"Internal\",\r\n" +
" \"status\": \"Closed\"\r\n" +
" },\r\n" +
" {\r\n" +
" \"id\": 1002,\r\n" +
" \"type\": \"External\",\r\n" +
" \"status\": \"Closed\"\r\n" +
" },\r\n" +
" {\r\n" +
" \"id\": 1003,\r\n" +
" \"type\": \"Internal\",\r\n" +
" \"status\": \"Open\"\r\n" +
" },\r\n" +
" {\r\n" +
" \"id\": 1004,\r\n" +
" \"type\": \"Internal\",\r\n" +
" \"status\": \"Open\"\r\n" +
" }\r\n" +
"]";
String filterId = "$.[?(@.id > 1001)]"; //For Id > 1001
String filterType = "$.[?(@.type in ['External'])]"; //for External type
String filterTypeAndId = "$.[?((@.id > 1001) && (@.type in ['Internal']))]"; //for External type with Id > 1001
String filterTypeAndId2 = "$.[?((@.id > 1001) && (@.type in ['Internal', 'External']))]"; //for External type with Id > 1001
DocumentContext documentContext = JsonPath.parse(jsonData);
System.out.println(documentContext.read(filterId).toString());
System.out.println(documentContext.read(filterType).toString());
System.out.println(documentContext.read(filterTypeAndId).toString());
System.out.println(documentContext.read(filterTypeAndId2).toString());
}
[{"id":1002,"type":"External","status":"Closed"},{"id":1003,"type":"Internal","status":"Open"},{"id":1004,"type":"Internal","status":"Open"}]
[{"id":1002,"type":"External","status":"Closed"}]
[{"id":1003,"type":"Internal","status":"Open"},{"id":1004,"type":"Internal","status":"Open"}]
[{"id":1002,"type":"External","status":"Closed"},{"id":1003,"type":"Internal","status":"Open"},{"id":1004,"type":"Internal","status":"Open"}]