Java 过滤Jackson';基于属性值的JsonNode元素
我正在使用Jackson的JsonNode解析json。我的json结构如下所示(设为变量rawJson): 如何通过过滤属性Java 过滤Jackson';基于属性值的JsonNode元素,java,json,jackson,Java,Json,Jackson,我正在使用Jackson的JsonNode解析json。我的json结构如下所示(设为变量rawJson): 如何通过过滤属性name,获得特定的JsonNode元素?如果我想获取值大于X的JsonNode元素,怎么样?我可以在不循环使用结果变量的情况下完成这些操作吗?您可以使用java.lang.Iterable的forEach(Consumer c)(JDK 1.8+)函数来执行列表迭代。此方法采用一个消费者实例,该实例处理列表中的所有值。此方法可以扩展为在迭代时使用过滤器,如下所示: pu
name
,获得特定的JsonNode元素?如果我想获取值大于X的JsonNode元素,怎么样?我可以在不循环使用结果
变量的情况下完成这些操作吗?您可以使用java.lang.Iterable的forEach(Consumer c)
(JDK 1.8+)函数来执行列表迭代。此方法采用一个消费者
实例,该实例处理列表中的所有值。此方法可以扩展为在迭代时使用过滤器,如下所示:
public static void main(String[] args) {
ObjectMapper om = new ObjectMapper();
InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("test.json");
try {
JsonNode node = om.readValue(in, JsonNode.class).get("results");
NodeFilteringConsumer consumer = new NodeFilteringConsumer(new NodeFilter() {
@Override
public boolean apply(JsonNode node) {
//Filter for node with values greater than 20.
return node.get("values").asDouble() > 20;
}
});
node.forEach(consumer);
} catch (Exception e) {
e.printStackTrace();
}
}
public static interface NodeFilter{
boolean apply(JsonNode node);
}
public static class NodeFilteringConsumer implements Consumer<JsonNode>{
private NodeFilter f;
public NodeFilteringConsumer(NodeFilter f) {
this.f = f;
}
@Override
public void accept(JsonNode t) {
if (f.apply(t)){
//Only filtered records reach here
System.out.println("Filter applied on node:" + t);
}
}
}
publicstaticvoidmain(字符串[]args){
ObjectMapper om=新的ObjectMapper();
InputStream in=Thread.currentThread().getContextClassLoader().getResourceAsStream(“test.json”);
试一试{
JsonNode node=om.readValue(in,JsonNode.class).get(“结果”);
NodeFilteringConsumer=新的NodeFilteringConsumer(新的NodeFilter(){
@凌驾
公共布尔应用(JsonNode节点){
//筛选值大于20的节点。
返回node.get(“values”).asDouble()>20;
}
});
节点forEach(消费者);
}捕获(例外e){
e、 printStackTrace();
}
}
公共静态接口NodeFilter{
布尔应用(JsonNode);
}
公共静态类NodeFilteringConsumer实现使用者{
专用节点过滤器f;
公共NodeFilteringConsumer(NodeFilter f){
这个。f=f;
}
@凌驾
公共void接受(JsonNode t){
如果(f.适用(t)){
//只有经过过滤的记录才能到达这里
System.out.println(“应用于节点:+t的过滤器”);
}
}
}
目前我仅限于使用Java 7。在这种情况下,我认为您必须为每个循环编写一个for循环,以迭代结果的所有JSONNode。您可以在for循环内重复使用NodeFilter接口。此解决方案不会阻止Jackson解析整个负载。也许这正是OP想要的,所以不是说这是一个糟糕的答案,而是我实际上在寻找“当某个条件不成立时如何跳过数据的实际解析”(这对于大型JSON文件特别有用)
ObjectMapper mapper = new ObjectMapper();
JsonNode results = mapper.readValue(rawJson, JsonNode.class).get("results");
public static void main(String[] args) {
ObjectMapper om = new ObjectMapper();
InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("test.json");
try {
JsonNode node = om.readValue(in, JsonNode.class).get("results");
NodeFilteringConsumer consumer = new NodeFilteringConsumer(new NodeFilter() {
@Override
public boolean apply(JsonNode node) {
//Filter for node with values greater than 20.
return node.get("values").asDouble() > 20;
}
});
node.forEach(consumer);
} catch (Exception e) {
e.printStackTrace();
}
}
public static interface NodeFilter{
boolean apply(JsonNode node);
}
public static class NodeFilteringConsumer implements Consumer<JsonNode>{
private NodeFilter f;
public NodeFilteringConsumer(NodeFilter f) {
this.f = f;
}
@Override
public void accept(JsonNode t) {
if (f.apply(t)){
//Only filtered records reach here
System.out.println("Filter applied on node:" + t);
}
}
}