1. 程式人生 > 其它 >FastJson和Gson在將json字串轉為複雜物件的一些區別

FastJson和Gson在將json字串轉為複雜物件的一些區別

技術標籤:工作隨筆jsongsonjava

下文如果錯誤請批評指出。

1、maven依賴

  • FastJson
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.56</version>
</dependency>
  • Gson
<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.6</version>
</dependency>

2、轉換方法

  • FastJson
public static void main(String[] args) {
        String response="";
        T fastjsonRresult = JSON.parseObject(response, new TypeReference<T>(){});
}
  • Gson
public static void main(String[] args) {
        String response="";
        Gson gson = new Gson();
        T gsonResult = gson.fromJson(response, new TypeToken<T>(){}.getType());
}

3、所轉換物件的構造方法

  • FastJson將json字串轉為物件時,依賴物件的構造方法和get/set方法,所以在使用FastJson時,如果物件添加了自定義構造,記得加上無參和全參構造(使用lombok註解除了新增@Data,順便加上@AllArgsConstructor和@NoArgsConstructor)。
  • Gson將json字串轉為物件時,即使物件沒有對應構造方法和get/set方法,也能按照屬性的名字進行解析

4、屬性欄位大小寫

  • FastJson在反序列化的時候,是對大小寫不敏感的(例如,“DaTa”對應的值可以解析到data欄位),而在序列化的時候,則預設又是會將首字母置為小寫(例如,會把Data欄位轉為“data”,可使用@JSONField(name = "Data")來指定轉為“Data”)。
  • Gson無論是序列化還是反序列化,完全對欄位名大小寫敏感的

5、巢狀帶泛型物件的型別

  • FastJson解析物件時,不指定泛型,則泛型型別為JsonObject
  • Gson解析物件時,不指定泛型,則泛型型別為LinkedTreeMap(Gson包裡的),不可強轉為JsonObject,也沒有toJsonString方法(需要注意的地方就是,指定的泛型物件中包含的物件又有泛型的話,由於沒辦法在解析時指定,在取物件強轉時需注意型別)。