天天看點

fastjson的基本使用方法

1 fastjson主要的API

fastjson入口類是com.alibaba.fastjson.JSON, 主要API是JSON.toJSONString和parseObject,使用fastjson要注意要轉換的類必須有預設的無參構造方法。

  • 序列化:

    String jsonString = JSON.toJSONString(obj);

  • 反序列化:

    VO vo = JSON.parseObject("jsonString", VO.class);

  • 泛型反序列化:
List<VO> list = JSON.parseObject("jsonString", new TypeReference<List<VO>>(){});

注意:VO必須有預設無參構造方法
           
  • 其他主要API:
public static final Object parse(String text); // 把JSON文本parse為JSONObject或者JSONArray 
public static final JSONObject parseObject(String text); // 把JSON文本parse成JSONObject    
public static final <T> T parseObject(String text, Class<T> clazz); // 把JSON文本parse為JavaBean 
public static final JSONArray parseArray(String text); // 把JSON文本parse成JSONArray 
public static final <T> List<T> parseArray(String text, Class<T> clazz); //把JSON文本parse成JavaBean集合 
public static final String toJSONString(Object object); // 将JavaBean序列化為JSON文本 
public static final String toJSONString(Object object, boolean prettyFormat); // 将JavaBean序列化為帶格式的JSON文本 
public static final Object toJSON(Object javaObject); 将JavaBean轉換為JSONObject或者JSONArray。
           

說明:

SerializeWriter:相當于StringBuffer

JSONArray:相當于List

JSONObject:相當于Map

JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd";  
JSON.toJSONString(obj, SerializerFeature.WriteDateUseDateFormat);
           
  • 反序列化能夠自動識别如下日期格式:
    • ISO-8601日期格式
    • yyyy-MM-dd
    • yyyy-MM-dd HH:mm:ss
    • yyyy-MM-dd HH:mm:ss.SSS
    • 毫秒數字
    • 毫秒數字字元串
    • NET JSON日期格式
    • new Date(198293238)

3 過濾屬性

需要根據不同的環境傳回定制化傳回屬性時,可以使用SimplePropertyPreFilter。

  • SimplePropertyPreFilter的代碼接口如下:
public class SimplePropertyPreFilter implements PropertyPreFilter {      
      public SimplePropertyPreFilter(String... properties){
          this(null, properties);
      }

      public SimplePropertyPreFilter(Class<?> clazz, String... properties){
          ... ...
      }

      public Class<?> getClazz() {
          return clazz;
      }

      public Set<String> getIncludes();

      public Set<String> getExcludes();
  ...
  }
           

你可以配置includes、excludes。當class不為null時,針對特定類型;當class為null時,針對所有類型。

當includes的size > 0時,屬性必須在includes中才會被序列化,excludes優先于includes。

  • 使用方法:

    在1.1.23版本之後,JSON提供新的序列化接口toJSONString,如下:

String JSON.toJSONString(Object, SerializeFilter, SerializerFeature...);

用法如下:

User user = new User();
 user.setName("shamo");
 user.setPwd("123");
 user.setAge();

 SimplePropertyPreFilter filter = new SimplePropertyPreFilter(User.class, "pwd", "age");
 Set<String> includes = filter.getIncludes();
 Set<String> excludes = filter.getExcludes();
 includes.add("name");
 excludes.add("pwd");
 String json = JSON.toJSONString(user, filter);
 System.out.println(json);
           

輸出:

{"age":25,"name":"shamo"}

4 修改屬性

可以使用JSONObject對json形式的字元串進行任意的增删改

用法如下:

String jsonString = JSON.toJSONString(user);
JSONObject jsonObject = JSON.parseObject(jsonString);
jsonObject.put("gender", "male");
jsonObject.put("pwd","456");
jsonObject.remove("name");
String json = JSON.toJSONString(jsonObject);
System.out.println(json);
           

輸出:

{"pwd":"456","age":,"gender":"male"}
           

5 SerializerFeature序列化屬性

DisableCheckSpecialChar:一個對象的字元串屬性中如果有特殊字元如雙引号,将會在轉成json時帶有反斜杠轉移符。如果不需要轉義,可以使用這個屬性。預設為false 
QuoteFieldNames———-輸出key時是否使用雙引号,預設為true 
WriteMapNullValue——–是否輸出值為null的字段,預設為false 
WriteNullNumberAsZero—-數值字段如果為null,輸出為0,而非null 
WriteNullListAsEmpty—–List字段如果為null,輸出為[],而非null 
WriteNullStringAsEmpty—字元類型字段如果為null,輸出為”“,而非null 
WriteNullBooleanAsFalse–Boolean字段如果為null,輸出為false,而非null

WriteClassName:
支援序列化時寫入類型資訊,進而使得反序列化時不丢失類型資訊。例如:
Color color = Color.RED; String text = JSON.toJSONString(color,SerializerFeature.WriteClassName); System.out.println(text); 
輸出結果:
{"@type":"java.awt.Color","r":255,"g":0,"b":0,"alpha":255}
由于序列化帶了類型資訊,使得反序列化時能夠自動進行類型識别,例如:
String text = ...; //{"@type":"java.awt.Color","r":255,"g":0,"b":0,"alpha":255}
Color color = (Color) JSON.parse(text);