Fastjson JSONPath


1. Pengenalan kepada versi JSONPath

fastjson selepas 1.2.0 menyokong JSONPath. Ini adalah ciri yang sangat berkuasa yang boleh digunakan sebagai Bahasa Pertanyaan Objek (OQL) dalam rangka kerja Java.

2

Adalah disyorkan untuk cache objek JSONPath, yang boleh meningkatkan prestasi penilaian. sintaks sokongan

nombor Akses kumpulan, di mana nombor adalah nombor, Boleh menjadi nombor negatif. Contohnya, $[0].leader.departments[-1].name

Berbilang elemen tatasusunan diakses, dengan num ialah nombor, yang boleh nombor negatif, dan mengembalikan nombor dalam tatasusunan Pelbagai elemen. Contohnya, $[0,3,-2,5]contohnya $.departs[nama seperti 'sz*'], wildcard hanya menyokong %sokongan bukan suka Penapisan pemadanan biasa jenis rentetan, Contohnya, jabatan[nama seperti 'aa(.)*'], [masukkan ('v0 ', 'v1') ]Contohnya: $.departs[id not in (101,102)] [kunci antara 234 dan 456]ANTARA penapisan, menyokong jenis angka, menyokong bukan antara Contohnya: $.berlepas[id antara 101 dan 201]panjang tatasusunan. Contohnya $.values.size() menyokong jenis java.util.Map dan java.util.Collection dan array akses hartanah, seperti $.name.. akses, Contohnya, $..name['key']akses hartanah. Contohnya $['name']['key0','key1']

Semantik dua cara penulisan berikut adalah sama:

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

dan

$.store.book[0].title

4. Contoh sintaks

Objek akar
[start:end]akses julat tatasusunan, di mana permulaan dan akhir ialah jadual kecil permulaan dan subskrip berakhir, yang boleh menjadi nombor negatif dan pulangan berbilang nombor dalam elemen tatasusunan. Sebagai contoh, $[0:5]
[start:end :step]akses julat tatasusunan, di mana permulaan dan akhir ialah jadual kecil permulaan dan subskrip penamat, yang boleh menjadi nombor negatif ialah langkah saiz, dan mengembalikan Elemen Berbilang. Contohnya $[0:5:2]
[?(key)]Penapisan atribut objek, contohnya $.departs[?(nama)]
[key > nilai berangka Jenis penapisan perbandingan atribut objek, contohnya $.departs[id >= 123], sokongan operator perbandingan =,!=,>,>=,<,<=
[kunci = '123' [ kunci seperti 'aa%']Jenis rentetan seperti penapisan,
[key rlike ' regexpr']
Sintaks biasa ialah sintaks biasa jdk, menyokong bukan rlike
IN penapisan, menyokong jenis rentetan dan berangka $.departs[name in ('wenshao','Yako')]
$.berlepas1]1 dan bukan

panjang() Atau saiz()

.


..
*

Semua sifat objek, seperti $.leader.*

Akses berbilang atribut. Contohnya $['id','name']
. 5.2 Contoh 2Baca atribut berbilang elemen dalam set5.3 Contoh 3Kembalikan berbilang elemen dalam set
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; }
}
$[ -1]Elemen terakhir
$[:-2]1 hingga 2 hingga terakhir
$[1:]Semua elemen selepas yang ke-2
$['store']['book'][0]['title']

Contoh set ulangan 5.4

Kembalikan subset koleksi melalui penapisan bersyarat

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, "[1,2]"); // 返回下标为1和2的元素
Assert.assertEquals(2, result.size());
Assert.assertSame(entities.get(1), result.get(0));
Assert.assertSame(entities.get(2), result.get(1));

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

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