2015-10-19 105 views
1

给定JSON字段名称,例如“my_field”和FasterXML JSON ObjectNode,如何遍历JSON并获取JSON中出现“my_field”的任何地方的完全限定路径?如何获得使用FasterXML发生JSON字段的全部路径?

"top_field": { 
     "mid_field": [ 
      { 
       "my_field": true, 
      }, 
      { 
       "my_field": true, 
      } 
     ], 
     "another_mid_field": [ 
      { 
       "my_field": false 
      } 
     ] 
    } 

我想有以下结果:

top_field.mid_field[0].my_field 
top_field.mid_field[1].my_field 
top_field.another_mid_field.my_field 

有没有不必解析JSON的所有值公开此信息FasterXML库的一部分?我之前使用递归来实现这一点,从根top_field开始向下走,在去的时候传递每个对象,但是这很容易在大的JSON对象上发生堆栈溢出。

回答

1

这个主:

package jsonpath; 

import java.util.List; 

import com.jayway.jsonpath.Configuration; 
import com.jayway.jsonpath.Option; 
import static com.jayway.jsonpath.JsonPath.*; 

public class GetPaths { 

    public static void main(String [] args) { 
     String json = "{\"top_field\": { \"mid_field\": [ { \"my_field\": true, }, { \"my_field\": true, } ], \"another_mid_field\": [ { \"my_field\": false } ] }}"; 

     Configuration conf = Configuration.builder().options(Option.AS_PATH_LIST).build(); 
     List<String> pathList = using(conf).parse(json).read("$..my_field"); 
     for(String path : pathList) { 
      System.out.println(path); 
     } 
    } 
} 

将输出准确

$['top_field']['mid_field'][0]['my_field'] 
$['top_field']['mid_field'][1]['my_field'] 
$['top_field']['another_mid_field'][0]['my_field'] 

如果你做一些简单的串上一个替代我认为it's一个很好的和简单的解决方案。我不确定你是否能得到与普通的Jackson/FasterXML类似的东西。 JsonPath在引擎盖下使用了Jackson。

+0

谢谢,这太棒了!我们使用JsonPath,但不幸的是仍然在0.9,所以我不能使用这个... – Conor