Fastjson JSONPath


1. JSONPath 소개

fastjson 1.2.0 이후 버전은 JSONPath를 지원합니다. 이는 Java 프레임워크에서 OQL(Object Query Language)로 사용할 수 있는 매우 강력한 기능입니다.

2.API

package com.alibaba.fastjson;

public class JSONPath {          
     //  求值,静态方法
     public static Object eval(Object rootObject, String path);

     // 计算Size,Map非空元素个数,对象非空元素个数,Collection的Size,数组的长度。其他无法求值返回-1
     public static int size(Object rootObject, String path);

     // 是否包含,path中是否存在对象
     public static boolean contains(Object rootObject, String path) { }

     // 是否包含,path中是否存在指定值,如果是集合或者数组,在集合中查找value是否存在
     public static boolean containsValue(Object rootObject, String path, Object value) { }

     // 修改制定路径的值,如果修改成功,返回true,否则返回false
     public static boolean set(Object rootObject, String path, Object value) {}

     // 在数组或者集合中添加元素
     public static boolean array_add(Object rootObject, String path, Object... values);
}

평가 성능을 향상시킬 수 있도록 JSONPath 객체를 캐시하는 것이 좋습니다.

3. 지원 구문

예를 들어 $.departs[name like 'sz*'], 와일드카드는 %support not like예: Departments[name like 'aa(.)*'], 정규 구문은 jdk의 정규 구문이며, rlike를 지원하지 않습니다예: $.departs[name in ('wenshao','Yako')] $.departs[id not in (101,102) ]사이가 아닌 지원예: $.departs[101과 201 사이의 ID]$.departs[id가 101과 201 사이가 아님 ]는 java.util.Map 및 java.util.Collection 유형을 지원하고 $.name..
JSONPATHDescription
$루트 개체(예: $.name
[num]number) 그룹 액세스(여기서 num은 다음과 같습니다) 숫자, 음수일 수 있습니다. 예를 들어 $[0].leader.departments[-1].name
[num0,num1,num2...]배열의 여러 요소에 액세스합니다. 여기서 num은 숫자입니다. 음수를 반환하고 다중 요소를 반환합니다. 예를 들어 $[0,3,-2,5]
[start:end]배열 범위 액세스. 여기서 시작과 끝은 시작하는 작은 테이블이고 끝 첨자는 음수일 수 있고 반환될 수 있음 배열 요소에 여러 개의 숫자가 있습니다. 예를 들어 $[0:5]
[start:end :step]배열 범위 액세스. 여기서 start와 end는 시작하는 작은 테이블이고 끝나는 첨자는 음수가 될 수 있습니다. step은 단계입니다. 크기를 지정하고 여러 요소를 반환합니다. 예를 들어 $[0:5:2]
[?(key)]Object 속성이 null이 아닌 필터링(예: $.departs[?(name)]
[key > ]숫자 값 유형 객체 속성 비교 필터링(예: $.departs[id >= 123], 비교 연산자 지원 =,!=,>,>=,<,<=
[ key = '123' [ key like 'aa%']필터링과 같은 문자열 유형,
[key rlike 'regexpr']

문자열 유형 정규 일치 필터링,
[key in (' v0', 'v1') ]

IN 필터링, 문자열 및 숫자 유형 지원

[234와 456 사이의 키]

BETWEEN 필터링, 숫자 유형 지원,

length() 또는 size()

배열 길이. 예를 들어 $.values.size()

deepScan 속성과 같은 배열
. 속성 액세스를 지원합니다. 액세스(예: $..name
*$.leader.*
['key']와 같은 개체의 모든 속성) 속성 액세스입니다. 예를 들어 $['name']
['key0','key1']다중 속성 액세스. 예를 들어 $['id','name']

다음 두 가지 쓰기 방법은 동일한 의미를 갖습니다:

$.store.book[0].title

$['store']['book'][0]['title']

4 . 구문 예

# 🎜🎜#$[:-2]마지막에서 1~2번째$[1:] #🎜🎜 #$[1,2,3]
JSONPathSemantics
$ 루트 개체
$[-1]마지막 요소
두 번째 요소 이후의 모든 요소
1 세트, 2, 3개 요소

#🎜 🎜 ## 🎜 🎜#5.2 예 2

#🎜🎜 #5.3 예 3

컬렉션의 여러 요소 반환

5.4 예 4

범위별로 컬렉션의 하위 집합 반환

5.5 예 5#🎜🎜 ##🎜 🎜# 집합의 하위 집합을 반환하려면 조건으로 필터링

List<Entity> entities = new ArrayList<Entity>();
entities.add(new Entity(1001, "ljw2083"));
entities.add(new Entity(1002, "wenshao"));
entities.add(new Entity(1003, "yakolee"));
entities.add(new Entity(1004, null));

List<Object> result = (List<Object>) JSONPath.eval(entities, "[id in (1001)]");
Assert.assertEquals(1, result.size());
Assert.assertSame(entities.get(0), result.get(0));

5.6 예 6 #🎜 🎜#

속성값 필터링 조건에 따라 객체 반환 여부를 결정하고 객체를 수정한 후 배열 속성에 요소를 추가합니다
Entity entity = new Entity(1001, "ljw2083");
Assert.assertSame(entity , JSONPath.eval(entity, "[id = 1001]"));
Assert.assertNull(JSONPath.eval(entity, "[id = 1002]"));

JSONPath.set(entity, "id", 123456); //将id字段修改为123456
Assert.assertEquals(123456, entity.getId().intValue());

JSONPath.set(entity, "value", new int[0]); //将value字段赋值为长度为0的数组
JSONPath.arrayAdd(entity, "value", 1, 2, 3); //将value字段的数组添加元素1,2,3

5.7 예시 7

Map root = Collections.singletonMap("company", //
                                    Collections.singletonMap("departs", //
                                                             Arrays.asList( //
                                                                            Collections.singletonMap("id",
                                                                                                     1001), //
                                                                            Collections.singletonMap("id",
                                                                                                     1002), //
                                                                            Collections.singletonMap("id", 1003) //
                                                             ) //
                                    ));

List<Object> ids = (List<Object>) JSONPath.eval(root, "$..id");
assertEquals(3, ids.size());
assertEquals(1001, ids.get(0));
assertEquals(1002, ids.get(1));
assertEquals(1003, ids.get(2));