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 12, 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)] 集合对象属性非空过滤,例如$.departments[?(@.name)]
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