轉載:http://blog.csdn.net/qq_20641565/article/details/77162868
如果項目需求是從某些復雜的json里面取值進行計算,用jsonpath+IK(ik-expression)來處理十分方便,jsonpath用來取json里面的值然后用IK自帶的函數進行計算,如果是特殊的計算那就自定義IK方法搞定,配置化很方便.
下面簡單介紹下jsonpath的使用方法,主要測試都在JsonPathDemo類里面:
下面是一個簡單的Java項目demo:
注意: 其中他的max,min,avg,stddev函數只能類似於如下處理:
//正確寫法 但是感覺很雞肋 context.read("$.avg($.result.records[0].loan_type,$.result.records[1].loan_type,$.result.records[2].loan_type)");
- 1
- 2
- 1
- 2
不能傳入list 感覺比較雞肋,如果傳入list 他會報錯(如下錯誤寫法):
//這樣會報錯 Object maxV = context.read("$.max($.result.records[*].loan_type)"); //這樣也會報錯 Object maxV = context.read("$.result.records[*].loan_type.max()"); //如果json文件中是這樣:"loan_type":"2",也會報錯,"loan_type":2 這樣才被認為是數字
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
報錯信息都一樣,如下:
Exception in thread "main" com.jayway.jsonpath.JsonPathException: Aggregation function attempted to calculate value using empty array
- 1
- 1
JsonPathDemo是一個測試demo:
public class JsonPathDemo {
public static void main(String[] args) {
String json = FileUtils.readFileByLines("demo.json"); ReadContext context = JsonPath.parse(json); //1 返回所有name List<String> names = context.read("$.result.records[*].name"); //["張三","李四","王五"] System.out.println(names); //2 返回所有數組的值 List<Map<String, String>> objs = context.read("$.result.records[*]"); //[{"name":"張三","pid":"500234199212121212","mobile":"18623456789","applied_at":"3","confirmed_at":"5","confirm_type":"overdue","loan_type":"1","test":"mytest","all":"2"},{"name":"李四","pid":"500234199299999999","mobile":"13098765432","applied_at":"1","confirmed_at":"","confirm_type":"overdue","loan_type":"3","all":"3"},{"name":"王五","pid":"50023415464654659","mobile":"1706454894","applied_at":"-1","confirmed_at":"","confirm_type":"overdue","loan_type":"3"}] System.out.println(objs); //3 返回第一個的name String name0 = context.read("$.result.records[0].name"); //張三 System.out.println(name0); //4 返回下標為0 和 2 的數組值 List<String> name0and2 = context.read("$.result.records[0,2].name"); //["張三","王五"] System.out.println(name0and2); //5 返回下標為0 到 下標為1的 的數組值 這里[0:2] 表示包含0 但是 不包含2 List<String> name0to2 = context.read("$.result.records[0:2].name"); //["張三","李四"] System.out.println(name0to2); //6 返回數組的最后兩個值 List<String> lastTwoName = context.read("$.result.records[-2:].name"); //["李四","王五"] System.out.println(lastTwoName); //7 返回下標為1之后的所有數組值 包含下標為1的 List<String> nameFromOne = context.read("$.result.records[1:].name"); //["李四","王五"] System.out.println(nameFromOne); //8 返回下標為3之前的所有數組值 不包含下標為3的 List<String> nameEndTwo = context.read("$.result.records[:3].name"); //["張三","李四","王五"] System.out.println(nameEndTwo); //9 返回applied_at大於等於2的值 List<Map<String, String>> records = context.read("$.result.records[?(@.applied_at >= '2')]"); //[{"name":"張三","pid":"500234199212121212","mobile":"18623456789","applied_at":"3","confirmed_at":"5","confirm_type":"overdue","loan_type":"1","test":"mytest","all":"2"}] System.out.println(records); //10 返回name等於李四的值 List<Map<String, String>> records0 = context.read("$.result.records[?(@.name == '李四')]"); //[{"name":"李四","pid":"500234199299999999","mobile":"13098765432","applied_at":"1","confirmed_at":"","confirm_type":"overdue","loan_type":"3"}] System.out.println(records0); //11 返回有test屬性的數組 List<Map<String, String>> records1 = context.read("$.result.records[?(@.test)]"); //[{"name":"張三","pid":"500234199212121212","mobile":"18623456789","applied_at":"3","confirmed_at":"5","confirm_type":"overdue","loan_type":"1","test":"mytest","all":"2"}] System.out.println(records1); //12 返回有test屬性的數組 List<String> list = context.read("$..all"); //["1","4","2","3"] System.out.println(list); //12 以當前json的某個值為條件查詢 這里ok為1 取出records數組中applied_at等於1的數組 List<String> ok = context.read("$.result.records[?(@.applied_at == $['ok'])]"); //["1","4","2","3"] System.out.println(ok); //13 正則匹配 List<String> regexName = context.read("$.result.records[?(@.pid =~ /.*999/i)]"); //[{"name":"李四","pid":"500234199299999999","mobile":"13098765432","applied_at":"1","confirmed_at":"","confirm_type":"overdue","loan_type":"3",