fastjson(9)JSONpath 사용(1)

18770 단어 FastJSON
fastjson 1.2.0 이후 버 전 은 JSONPath 를 지원 합 니 다.이것 은 매우 강력 한 기능 으로 자바 프레임 워 크 에서 대상 으로 언어(OQL)를 조회 하여 사용 할 수 있다.
JSONPath 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 대상 을 캐 시 하 는 것 을 권장 합 니 다.그러면 값 을 구 하 는 성능 을 향상 시 킬 수 있 습 니 다.
JSONPATH
묘사 하 다.
$
뿌리 원 소 를 나타 낸다
@
현재 요소
. or []
하위 요소
n/a
부모 요소
..
역귀 하강,JSONPath 는 E4X 에서 참고 한 것 이다.
*
모든 요 소 를 나타 내 는 마스크
?()
필터 표현 식 적용
[num]
배열 접근,그 중 num 은 숫자 이 고 마이너스 일 수 있 습 니 다.예 를 들 어$[0].leader.departments[-1].name
[num0,num1,num2…]
배열 의 여러 요소 에 접근 합 니 다.그 중에서 num 은 숫자 이 고 마이너스 일 수 있 으 며 배열 의 여러 요 소 를 되 돌려 줍 니 다.예 를 들 어$[0,3,-2,5]
[start:end]
배열 범위 에 접근 합 니 다.그 중에서 start 와 end 는 작은 시 계 를 시작 하고 아래 표 시 를 끝 냅 니 다.마이너스 일 수 있 습 니 다.배열 의 여러 요 소 를 되 돌려 줍 니 다.예 를 들 어$[0:5]
[start:end:step]
배열 범위 에 접근 합 니 다.그 중에서 start 와 end 는 작은 시 계 를 시작 하고 아래 표 시 를 끝 냅 니 다.마이너스 일 수 있 습 니 다.step 는 보폭 이 길 어서 배열 의 여러 요 소 를 되 돌려 줍 니 다.예 를 들 어$[0:5:2]
[ ?(key) ]
대상 속성 비 어 있 는 필터,예 를 들 어$.departs[?(name)]
[ key > 123]
수치 유형 대상 속성 비교 필터,예 를 들 어$.departs[id>=123],비교 연산 자 지원=,!=,>,>=,
[ key = ‘123’]
문자열 형식 대상 속성 비교 필터,예 를 들 어$.departs[name='123'],비교 연산 자 지원=,!=,>,>=,
[ key like ‘aa%’]
문자열 형식 like 필터,예 를 들 어$.departs[name like'sz*'],마스크 는%만 지원 합 니 다 not like
[ key rlike ‘regexpr’]
문자열 형식 은 필터 와 일치 합 니 다.예 를 들 어 departs[name like'aa(.)*'],정규 문법 은 jdk 의 정규 문법 입 니 다.not rlike 를 지원 합 니 다.
[ key in (‘v0’, ‘v1’)]
IN 필터,문자열 과 수치 형식 을 지원 합 니 다.예 를 들 어$.departs[name in('wenshao','Yako')],$.departs[id not in(101,102)]
[ key between 234 and 456]
BETWEEN 필터,수치 형식 지원,not between 지원.예 를 들 어$.departs[id between 101 and 201],$.departs[id not between 101 and 201]
length()또는 size()
배열 길이.예 를 들 어$.values.size()지원 형식 자바 util.Map 과 자바 util.collection 과 배열
[‘key’]
속성 접근.예 를 들 어$[name]
[‘key0’,’key1’]
여러 속성 접근.예 를 들 어$['id','name']
코드 예시
예제 대상:
package json.fastjson.jsonpath;

public class Entity {
    private Integer id;
    private String name;
    private Object value;

    public Entity(Integer id, String name, Object value) {
        super();
        this.id = id;
        this.name = name;
        this.value = value;
    }

    public Integer getId() {
        return id;
    }

    public Object getValue() {
        return value;
    }

    public String getName() {
        return name;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setValue(Object value) {
        this.value = value;
    }

    @Override
    public String toString() {
        return "Entity [id=" + id + ", name=" + name + ", value=" + value + "]";
    }

}

테스트 클래스:
package json.fastjson.jsonpath;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;

import com.alibaba.fastjson.JSONPath;

@SuppressWarnings("rawtypes")
public class TestJSONPath {

    @SuppressWarnings("unchecked")
    public static void main(String[] args) {

        List entities = new ArrayList();

        Entity entity1 = new Entity(1, "    1", "CSDN1");
        Entity entity2 = new Entity(2, "    2", "CSDN2");
        Entity entity3 = new Entity(3, "    3", "CSDN3");

        entities.add(entity1);
        entities.add(entity2);
        entities.add(entity3);


        System.out.println("
------ ---------------------------------------------------------"
); System.out.println("JSONPath.eval(entity, \"$.value\") = " + JSONPath.eval(entity1, "$.value")); System.out.println("JSONPath.contains(entity, \"$.value\") = " + JSONPath.contains(entity1, "$.value")); System.out.println("JSONPath.containsValue(entity, \"$.id\", 123) = " + JSONPath.containsValue(entity1, "$.id", 123)); System.out.println("JSONPath.containsValue(entity, \"$.value\", entity.getValue()) = " + JSONPath.containsValue(entity1, "$.value", entity1.getValue())); System.out.println("JSONPath.size(entity, \"$\") = " + JSONPath.size(entity1, "$")); System.out.println("JSONPath.size(new Object[], \"$\") = " + JSONPath.size(new Object[5], "$")); System.out.println("
------ :JSONPath.eval(entities, \"$.name\")-------------"
); List names = (List) JSONPath.eval(entities, "$.name"); // enties System.out.println("$.name = " + names); System.out.println("
------ :JSONPath.eval(entities, \"[1,2]\")--------------------"
); List result = (List) JSONPath.eval(entities, "[1,2]"); // 1 2 System.out.println("[1,2] = " + result); System.out.println("
------ :JSONPath.eval(entities, \"[0:2]\")-------------------"
); result = (List) JSONPath.eval(entities, "[0:2]"); // 0 2 System.out.println("[0:2] = " + result); System.out.println("
------ , :JSONPath.eval(entities, \"[id in (1)]\")-------"
); result = (List) JSONPath.eval(entities, "[id in (1)]"); System.out.println("[id in (1)] = " + result); System.out.println("
------ --------------------------------------------"
); System.out.println("[id = 1] = " + JSONPath.eval(entity1, "[id = 1]")); System.out.println("[id = 1002] = " + JSONPath.eval(entity1, "[id = 1002]")); System.out.println("
------ :JSONPath.set(entity1, \"id\", 123456);// id 123456-----"
); JSONPath.set(entity1, "id", 123456); // id 123456 System.out.println("entity1.getId().intValue()=" + entity1.getId().intValue()); System.out.println("
------ -----------------------------------------------------"
); JSONPath.set(entity1, "value", new ArrayList()); // value 0 System.out.println("entity1=" + entity1); JSONPath.arrayAdd(entity1, "value", 1, 2, 3); // value 1,2,3 System.out.println("entity1=" + entity1); System.out.println("
------ :JSONPath.eval(root, \"$..id\")-----------------------------"
); Map root = Collections.singletonMap("company", // Collections.singletonMap("departs", // Arrays.asList( // Collections.singletonMap("id", 1001), // Collections.singletonMap("id", 1002), // Collections.singletonMap("id", 1003) // ) // )); List ids = (List) JSONPath.eval(root, "$..id"); System.out.println("$..id = " + ids); } }

출력 결과:
------       ---------------------------------------------------------
JSONPath.eval(entity, "$.value") = CSDN1
JSONPath.contains(entity, "$.value") = true
JSONPath.containsValue(entity, "$.id", 123) = false
JSONPath.containsValue(entity, "$.value", entity.getValue()) = true
JSONPath.size(entity, "$") = 3
JSONPath.size(new Object[], "$") = 5

------             :JSONPath.eval(entities, "$.name")-------------
$.name = ["    1","    2","    3"]

------         :JSONPath.eval(entities, "[1,2]")--------------------
[1,2] = [Entity [id=2, name=    2, value=CSDN2], Entity [id=3, name=    3, value=CSDN3]]

------          :JSONPath.eval(entities, "[0:2]")-------------------
[0:2] = [Entity [id=1, name=    1, value=CSDN1], Entity [id=2, name=    2, value=CSDN2], Entity [id=3, name=    3, value=CSDN3]]

------      ,       :JSONPath.eval(entities, "[id in (1)]")-------
[id in (1)] = [{"id":1,"name":"    1","value":"CSDN1"}]

------                 --------------------------------------------
[id = 1] = Entity [id=1, name=    1, value=CSDN1]
[id = 1002] = null

------    :JSONPath.set(entity1, "id", 123456);// id     123456-----
entity1.getId().intValue()=123456

------           -----------------------------------------------------
entity1=Entity [id=123456, name=    1, value=[]]
entity1=Entity [id=123456, name=    1, value=[1, 2, 3]]

------      :JSONPath.eval(root, "$..id")-----------------------------
$..id = [1001, 1002, 1003]

좋은 웹페이지 즐겨찾기