Skip to content
This repository was archived by the owner on Oct 23, 2024. It is now read-only.

JSONPath

wenshao edited this page Oct 14, 2014 · 64 revisions

1. JSONPath介绍

fastjson 1.2.0之后的版本支持JSONPath。

2. API

 package com.alibaba.fastjson;
 
 public class JSONPath {
      // 构造函数
      public JSONPath(String path) {} 
      // 求值方法
      public Object eval(Object rootObject) { }
 }

建议缓存JSONPath对象,这样能够提高求值的性能。

3. 支持语法

JSONPATH 描述
$ 根对象
@ 当前对象
[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%'] 字符串类型对象属性匹配过滤,例如$.departs[name like 'sz*'],通配符只支持%
[key rlike 'regexpr'] 字符串类型对象属性正则匹配过滤,例如$.departs[name like 'aa(.)*'],正则语法为jdk的正则语法
[?(key in ('v0', 'v1'))] 字符串类型对象属性IN过滤,例如$.departs[name in ('wenshao','ljw2083')],
length() 或者 size() 数组长度。例如$.values.size(),支持类型java.util.Map和java.util.Collection和数组
. 属性访问,例如$.name
* 对象的所有属性,例如$.leader.*
['key'] 属性访问。例如$['name']
['key0','key1'] 多个属性访问。例如$['id','name']

以下两种写法的语义是相同的:

$.store.book[0].title

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

4. 语法示例

JSONPath 语义
$ 根对象
$[-1] 最后元素
$[:-2] 第1个至倒数第2个
$[1:] 第2个之后所有元素
$[1,2,3] 集合中1,2,3个元素

5. API 示例

public void test_entity() throws Exception {
    // 在实际使用中,建议缓存path对象,避免重复创建,这样性能更好
    JSONPath path = new JSONPath("$.value"); 

    Entity entity = new Entity();
    entity.setValue(new Object());
    Assert.assertSame(entity.getValue(), path.eval(entity));
}

public static class Entity {
    private Object value;
    public Object getValue() { return value; }
    public void setValue(Object value) { this.value = value; }
}

Clone this wiki locally