Fastjson JSONPath


1. JSONPath の概要

fastjson バージョン 1.2.0 以降は JSONPath をサポートします。これは、Java フレームワークのオブジェクト照会言語 (OQL) として使用できる非常に強力な機能です。

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 オブジェクトをキャッシュすることをお勧めします。これにより、評価のパフォーマンスが向上します。

JSONPATH説明$$.name[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']String 型オブジェクト属性をサポートします$.dearts[name = '123'] などの比較フィルタリング、比較演算子は =,!=,>,>=,<,<=#[key] をサポートします。 like 'aa%' ]例: $.Departs[name like 'sz*']、ワイルドカードは % のみをサポートします [key rlike 'regexpr']たとえば、Departments[name like 'aa(.)*']、[key in ('v0', 'v1')]例: #[234 から 456 までのキー]BETWEEN フィルタリング、数値型をサポート、$.Departs[101 から 201 までの ID]length() または size()配列の長さ。たとえば、$.values.size() . プロパティ アクセスをサポートします。例 $ .namedeepScan 属性アクセス (例: $..name#) ## $.leader.*['key'] プロパティ アクセスなど、オブジェクトのすべてのプロパティ。たとえば、$['name']['key0','key1']複数の属性アクセス。例: $['id','name']

次の 2 つの書き方のセマンティクスは同じです:

$.store.book[0].title

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

4 構文例

フィルタリングのような文字列型、like はサポートしません

文字列型の通常の一致フィルタリング、通常の構文は jdk の通常の構文であり、rlike ではなくサポートされます。

IN フィルタリング、文字列型と数値型をサポートします $.Departs[('wenshao','Yako') にある名前]
$.Departs[(101,102) にない ID]

間以外はサポート 例: $.Departs[ id が 101 から 201 の間ではありません]


タイプ java.util.Map および java.util.Collection と配列
##..
*
##$[1,2,3] 1 、コレクション内の 2、3 要素
JSONPathセマンティクス
$ルート オブジェクト
$[-1]最後の要素
$[:-2]最初から最後までの 2 番目の要素
$[1:]2 番目以降のすべての要素

public void test_entity() throws Exception {
   Entity entity = new Entity(123, new Object());

  Assert.assertSame(entity.getValue(), JSONPath.eval(entity, "$.value")); 
  Assert.assertTrue(JSONPath.contains(entity, "$.value"));
  Assert.assertTrue(JSONPath.containsValue(entity, "$.id", 123));
  Assert.assertTrue(JSONPath.containsValue(entity, "$.value", entity.getValue())); 
  Assert.assertEquals(2, JSONPath.size(entity, "$"));
  Assert.assertEquals(0, JSONPath.size(new Object[], "$")); 
}

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

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

   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; }
}

List<Entity> entities = new ArrayList<Entity>();
entities.add(new Entity("wenshao"));
entities.add(new Entity("ljw2083"));

List<String> names = (List<String>)JSONPath.eval(entities, "$.name"); // 返回enties的所有名称
Assert.assertSame(entities.get(0).getName(), names.get(0));
Assert.assertSame(entities.get(1).getName(), names.get(1));

##5.3 例 3

5.4 例 4
List<Entity> entities = new ArrayList<Entity>();
entities.add(new Entity("wenshao"));
entities.add(new Entity("ljw2083"));
entities.add(new Entity("Yako"));

List<Entity> result = (List<Entity>)JSONPath.eval(entities, "[0:2]"); // 返回下标从0到2的元素
Assert.assertEquals(3, result.size());
Assert.assertSame(entities.get(0), result.get(0));
Assert.assertSame(entities.get(1), result.get(1));
Assert.assertSame(entities.get(2), result.get(1));

##5.5 例 5

##5.6 例 6

オブジェクトを返すかどうかを決定します属性値のフィルタリング条件に基づいてオブジェクトを変更し、要素を配列に追加します。attribute

5.7 例 7

rreeee