Fastjson 常用API

什麼是fastjson

fastjson是阿里巴巴的開源JSON解析庫,它可以解析JSON格式的字符串,支持將Java Bean序列化爲JSON字符串,也可以從JSON字符串發序列化到Java Bean。

fastjson優點

速度快

fastjson相對其他的JSON庫的特點是快,從2011年fastjson1.1x發佈版本之後,其性能從未被其他Java實現的JSON庫超越。

使用廣泛

fastjson在阿里巴巴大規模使用,在數萬臺服務器上部署,fastjson在業界被廣泛接受。在2012年被開運中國評選爲最受歡迎的國產開源軟件之一。

測試完備

fastjson有很多的testcase,在1.2.11版本中,testcase超過3321個。每次發佈都會進行迴歸測試,保證質量穩定。

使用簡單

fastjson的API十分簡潔

String text = JSON.toJSONString(obj); //序列化
VO vo = JSON.parseObject("{...}",VO.classs);  //反序列話

功能完備

支持泛型,支持流處理超大文本,支持枚舉,支持序列化和反序列化擴展。

使用

  • maven中央倉庫:http://central.maven.org/maven2/com/alibaba/fastjson/
  • 直接配置依賴
<dependency>
     <groupId>com.alibaba</groupId>
     <artifactId>fastjson</artifactId>
     <version> x.x.x</version>
</dependency>

API

JSON這個類是fastjson API的入口,主要功能都通過這個類提供

序列化API

package com.alibaba.fastjson;

public abstract class JSON {
    // 將Java對象序列化爲JSON字符串,支持各種各種Java基本類型和JavaBean
    public static String toJSONString(Object object, SerializerFeature... features);

    // 將Java對象序列化爲JSON字符串,返回JSON字符串的utf-8 bytes
    public static byte[] toJSONBytes(Object object, SerializerFeature... features);

    // 將Java對象序列化爲JSON字符串,寫入到Writer中
    public static void writeJSONString(Writer writer, 
                                       Object object, 
                                       SerializerFeature... features);

    // 將Java對象序列化爲JSON字符串,按UTF-8編碼寫入到OutputStream中
    public static final int writeJSONString(OutputStream os, // 
                                            Object object, // 
                                            SerializerFeature... features);

}

JSON字符串反序列化API

package com.alibaba.fastjson;

public abstract class JSON {
    // 將JSON字符串反序列化爲JavaBean
    public static <T> T parseObject(String jsonStr, 
                                    Class<T> clazz, 
                                    Feature... features);

    // 將JSON字符串反序列化爲JavaBean
    public static <T> T parseObject(byte[] jsonBytes,  // UTF-8格式的JSON字符串
                                    Class<T> clazz, 
                                    Feature... features);

    // 將JSON字符串反序列化爲泛型類型的JavaBean
    public static <T> T parseObject(String text, 
                                    TypeReference<T> type, 
                                    Feature... features);

    // 將JSON字符串反序列爲JSONObject
    public static JSONObject parseObject(String text);
}

DEMO

parse Tree

import com.alibaba.fastjson.*;

JSONObject jsonObj = JSON.parseObject(jsonStr);

parse POJO

import com.alibaba.fastjson.JSON;

Model model = JSON.parseObject(jsonStr, Model.class);

parse POJO Generic

mport com.alibaba.fastjson.JSON;

Type type = new TypeReference<List<Model>>() {}.getType(); 
List<Model> list = JSON.parseObject(jsonStr, type);

convert POJO to string

import com.alibaba.fastjson.JSON;

Model model = ...; 
String jsonStr = JSON.toJSONString(model);

convert POJO to json bytes

import com.alibaba.fastjson.JSON;

Model model = ...; 
byte[] jsonBytes = JSON.toJSONBytes(model);

write POJO as json string to OutputStream

import com.alibaba.fastjson.JSON;

Model model = ...; 
OutputStream os;
JSON.writeJSONString(os, model);

write POJO as json string to Writer

import com.alibaba.fastjson.JSON;

Model model = ...; 
Writer writer = ...;
JSON.writeJSONString(writer, model);

JSONField

介紹

注意:若屬性是私有的,必須有set方法。否則無法序列化

public @interface JSONField {
     //配置序列化和反序列化的順序
    int ordinal() default 0;

    //指定字段的名稱
    String name() default "";

     //指定字段的格式,對日期格式有用
    String format() default "";

     //是否序列化
    boolean serialize() default true;

     //是否反序列化
    boolean deserialize() default true;

    SerializerFeature[] serialzeFeatures() default {};

    Feature[] parseFeatures() default {};

    String label() default "";

     //當你有一個字段是字符串類類型,裏面是json格式數據,你希望直接輸入,而不是經過轉義之後再輸出
    boolean jsonDirect() default false;

     //指定屬性的序列化類
    Class<?> serializeUsing() default Void.class;

    Class<?> deserializeUsing() default Void.class;

     //支持反序列化時使用多個不同的字段名稱
    String[] alternateNames() default {};

    boolean unwrapped() default false;

}

配置方式

JSONField可以配置在字段或者setter/getter方法上。例如:

配置在字段上

public class A{
     
     @JSONField(name="ID")
     private int id;

     public int getId() {return id;}
     public void setId(int value) {this.id = id;}
}
配置在setter/getter上
public class A {
      private int id;

      @JSONField(name="ID")
      public int getId() {return id;}
      @JSONField(name="ID")
      public void setId(int value) {this.id = id;}
}
使用format配置日期格式化
public class A{
     //配置date序列化和反序列化使用yyyyMMdd日期格式
     @JSONField(format="yyyyMMdd")
     public Date date;
}
使用serialize/deserialize指定字段不序列化
 public class A {
      @JSONField(serialize=false)
      public Date date;
 }

 public class A {
      @JSONField(deserialize=false)
      public Date date;
 }
使用ordinal指定字段的順序
public static class VO {
    @JSONField(ordinal = 3)
    private int f0;

    @JSONField(ordinal = 2)
    private int f1;

    @JSONField(ordinal = 1)
    private int f2;
}

JSONPath

介紹

可以在java框架中當作對象查詢語言使用

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 描述
$ 根對象,例如$.name
[num] 數組訪問,其中num是數字,可以是符數。例如$[0].leader.departments[-1].name
[num0,num1,…] 數組多個元素訪問,其中num是數字,可以是負數,返回數組中的多個元素。例如$[0,3,-1,4]
[start:end] 數組範圍訪問,其中start和end是開始下標和結束下標,可以是負數,返回數組中的多個元素。例如$[0:5]
[?(key)] 對象屬性非空過濾,例如$.departs[?(name)]
[key > 123] 數值類型對象屬性比較過濾,例如$.departs[id>=123],比較操作符支持=,!=,>,>=,<,<=
[key like ‘aa%’] 字符串類型like過濾,例如departs[name like ‘aa(.)*’],通配符只支持%;支持not like
[key rlike ‘regexpr’] 字符串類型正則匹配過濾,例如departs[name like ‘aa(.)*’],正則語法爲jdk的正則語法,支持not rlike
[key between 234 and 456] BETWEEN過濾, 支持數值類型,支持not between 例如: .departs[idbetween101and201];.departs[id between 101 and 201];.departs[id not between 101 and 201]
length() 或者 size() 數組長度。例如$.values.size() 支持類型java.util.Map和java.util.Collection和數組
. 屬性訪問,例如$.name
deepScan屬性訪問,例如$…name
* 對象的所有屬性,例如$.leader.*
[‘key’] 屬性訪問。例如$[‘name’]
[‘key0’,‘key1’] 多個屬性訪問。例如$[‘id’,‘name’]

toString

介紹

toString 將java對象序列化爲JSON字符串,fastjson提供了一個最簡單的入口

package com.alibaba.fastjson;

public abstract class JSON {
    public static String toJSONString(Object object);
}

writeJSONString

介紹

Fastjson在1.2.11版中,JSON類新增對OutputStream/Writer直接支持

package com.alibaba.fastjson;

public abstract class JSON {
   public static final int writeJSONString(OutputStream os, // 
                                             Object object, // 
                                             SerializerFeature... features) throws IOException;

    public static final int writeJSONString(OutputStream os, //
                                             Charset charset, //  
                                             Object object, // 
                                             SerializerFeature... features) throws IOException;

   public static final int writeJSONString(Writer os, // 
                                             Object object, // 
                                             SerializerFeature... features) throws IOException;
}

pareObject

介紹

在1.2.11版本中,fastjson新增加了對InputStream的支持


package com.alibaba.fastjson;

public abstract class JSON {
    public static <T> T parseObject(InputStream is, //
                                    Type type, //
                                    Feature... features) throws IOException;

    public static <T> T parseObject(InputStream is, //
                                    Charset charset, //
                                    Type type, //
                                    Feature... features) throws IOException;
}

Api Stream

Fastjson 當需要處理超大JSON文本時,需要Stream API

序列化

超大數組序列化

如果你的JSON格式是一個巨大的JSON數組,有很多元素,則先調用startArray,然後挨個寫入對象,然後調用endArray

JSONWriter writer = new JSONWriter(new FileWriter("文件位置"));
writer.startArray();
for(int i=0;i<1000*1000;++i){
     writer.writeValue(new VO());
}
writer.endArray();
writer.close();
超大JSON對象序列化

如果你的JSON格式是一個巨大的JSONObject,有很多Key/Value對,則先調用startObject,然後挨個寫入Key和Value,然後調用endObject。

JSONWriter writer = new JSONWriter(new FileWriter("文件位置"));
writer.startObject();
for(int i=0;i<1000*1000;++i){
     writer.writeKey("x"+i);
     writer.writeVaue(new VO());
}
wirter.endObject();
wirter.close();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章