如何过滤JSON数组?基于isCalculatedField:false筛选动态JSON数组
没问题!我来帮你搞定这个JSON数组筛选的需求。根据你给出的示例,我们需要把所有isCalculatedField: false的对象过滤出来,下面是几种主流语言的实现方式,你可以根据自己的技术栈选择:
JavaScript 实现
JavaScript里用数组的filter()方法最直接,一行代码就能搞定:
const originalArray = [ { "id": "CX.VOEFAIL.CREATEDT", "description": "Task Management - Voe Fail Review Create Date", "format": "STRING", "maxLength": 40, "modelPath": "Loan.CustomFields[(FieldName == 'CX.VOEFAIL.CREATEDT')].StringValue", "isCalculatedField": false }, { "id": "CX.VOEFAIL.TASKCNT", "description": "Task Management - VOE Fail Review Task Count", "format": "INTEGER", "maxLength": 0, "modelPath": "Loan.CustomFields[(FieldName == 'CX.VOEFAIL.TASKCNT')].IntValue", "isCalculatedField": true } ]; // 严格筛选isCalculatedField等于false的项 const filteredArray = originalArray.filter(item => item.isCalculatedField === false); console.log(filteredArray);
如果担心某些对象没有isCalculatedField字段,可以加个判断避免报错:
const filteredArray = originalArray.filter(item => item.hasOwnProperty('isCalculatedField') && item.isCalculatedField === false );
Python 实现
Python里用列表推导式是最简洁的写法,也可以用filter()函数:
original_array = [ { "id": "CX.VOEFAIL.CREATEDT", "description": "Task Management - Voe Fail Review Create Date", "format": "STRING", "maxLength": 40, "modelPath": "Loan.CustomFields[(FieldName == 'CX.VOEFAIL.CREATEDT')].StringValue", "isCalculatedField": False }, { "id": "CX.VOEFAIL.TASKCNT", "description": "Task Management - VOE Fail Review Task Count", "format": "INTEGER", "maxLength": 0, "modelPath": "Loan.CustomFields[(FieldName == 'CX.VOEFAIL.TASKCNT')].IntValue", "isCalculatedField": True } ] # 方法1:列表推导式(推荐,更符合Python风格) filtered_array = [item for item in original_array if not item.get("isCalculatedField", True)] # 方法2:使用filter+lambda filtered_array = list(filter(lambda x: x.get("isCalculatedField", True) is False, original_array)) print(filtered_array)
这里用item.get("isCalculatedField", True)是为了处理没有该字段的情况——默认把这类对象排除(返回True,所以not之后就是False,不会被加入结果)。如果想保留无该字段的对象,把默认值改成False就行。
Java 实现
Java 8及以上可以用Stream API来快速筛选,先把JSON解析成实体类或者Map,再进行过滤:
import com.fasterxml.jackson.databind.ObjectMapper; import java.util.List; import java.util.stream.Collectors; public class JsonFilterDemo { public static void main(String[] args) throws Exception { // 模拟解析后的实体类列表(实际项目中可通过Jackson/Gson解析JSON字符串) List<CustomField> originalList = List.of( new CustomField("CX.VOEFAIL.CREATEDT", "Task Management - Voe Fail Review Create Date", "STRING", 40, "Loan.CustomFields[(FieldName == 'CX.VOEFAIL.CREATEDT')].StringValue", false), new CustomField("CX.VOEFAIL.TASKCNT", "Task Management - VOE Fail Review Task Count", "INTEGER", 0, "Loan.CustomFields[(FieldName == 'CX.VOEFAIL.TASKCNT')].IntValue", true) ); // 筛选isCalculatedField为false的元素 List<CustomField> filteredList = originalList.stream() .filter(field -> !field.isCalculatedField()) .collect(Collectors.toList()); // 输出结果(转回JSON字符串) ObjectMapper mapper = new ObjectMapper(); System.out.println(mapper.writeValueAsString(filteredList)); } // 对应JSON结构的实体类 static class CustomField { private String id; private String description; private String format; private int maxLength; private String modelPath; private boolean isCalculatedField; // 构造函数 public CustomField(String id, String description, String format, int maxLength, String modelPath, boolean isCalculatedField) { this.id = id; this.description = description; this.format = format; this.maxLength = maxLength; this.modelPath = modelPath; this.isCalculatedField = isCalculatedField; } // Getter方法 public boolean isCalculatedField() { return isCalculatedField; } // 其他Getter省略,实际项目中需要补充 } }
小提示
如果你的JSON数组里存在部分对象没有isCalculatedField字段的情况,一定要根据业务需求决定是否保留这类对象——上面的示例默认是排除它们,你可以调整判断逻辑来适配自己的场景。
内容的提问来源于stack exchange,提问作者Venkatesh
相关产品推荐
相关产品推荐

