原文地址: http://blog.52sox.com/use-gso...
關於爲何忽然會使用Java,實際上仍是公司要將以前原先Python開發的Elasticsearch搜索集成到到項目中,而必須在國慶前給出1個版本。真心的說,進度很趕,對於一個平時不怎麼寫Java的Pythoner來講,花了1天的時間把對應的功能完成的70%,不得不說是1個奇蹟。
在Jest包中,有這麼1個Gson的包,用於對JSON數據進行序列化處理。這裏咱們單獨將其拿出來,稍微簡單的介紹一下,之後遇到一樣的問題的時候也不用慌。這裏使用的gson版本爲2.8.0
。
咱們使用maven下載了對應的包後,首先進行以下的操做:html
import com.google.gson.*;
接着咱們實例化Gson類,並調用其toJson方法對1個對象進行序列化處理:前端
import java.util.*; ... public class demo { public static void main(String[] args){ Gson json = new Gson(); HashMap<String,Object> map = new HashMap<>(); ArrayList<String> arr = new ArrayList<>(); arr.add("張三"); arr.add("李四"); map.put("person", arr); String str = json.toJson(map); System.out.println(str); } }
其結果以下所示:java
{"person":["張三","李四"]}
能夠說是1個很是簡單的例子。可是上面的方式,對於數值爲null的狀況會忽略掉對應的鍵名,以下所示:json
HashMap<String,Object> map = new HashMap<>(); ArrayList<String> arr = new ArrayList<>(); arr.add("張三"); arr.add("李四"); map.put("person", arr); map.put("gender", null); String str = json.toJson(map);
其結果爲:maven
{"person":["張三","李四"]}
此時咱們可使用以下的方式進行序列化:ide
GsonBuilder json = new GsonBuilder(); String str = json.serializeNulls().create().toJson(map);
另外,默認的序列化是沒有美化效果的,看起來不是很方便,此時咱們能夠添加setPrettyPrinting
方法來設置其爲美化的輸出:函數
String str = json.serializeNulls().setPrettyPrinting().create().toJson(map);
相應的結果當即就變成了:ui
{ "gender": null, "person": [ "張三", "李四" ] }
除此以外,咱們還能夠對類進行實例化,好比咱們有以下1個簡單的類:google
class Person { private String name = "張三"; private int age = 23; private String gender = "男"; @Override public String toString(){ return name + ":" + age + ":" + gender; } }
接着咱們再進行實例化處理:.net
Person person = new Person(); String str = json.toJson(person); System.out.println(str);
其結果爲:
{"name":"張三","age":23,"gender":"男"}
能夠看到,對應類的屬性都被實例化了。另外,在這裏咱們對類的toString進行了重載,也是1種序列化的方式。
另1個比較有意思的地方,可能就是使用註解的方式來進行序列化處理了,例如:
import com.google.gson.annotations.*; class Person { @SerializedName("username") @Expose(serialize = true) private String name = "張三"; private int age = 23; @Expose(serialize = true) private String gender = "男"; } ... Person person = new Person(); String str2 = json.serializeNulls().excludeFieldsWithoutExposeAnnotation().create().toJson(person); System.out.println(str2);
在這裏咱們只序列化name和gender這個2個屬性,其中屬性name序列化時候的名稱爲username,以後咱們調用GsonBuilder進行處理能夠獲得:
{"username":"張三","gender":"男"}
而對於反序列化處理,咱們只須要使用fromJson
函數便可,例如咱們能夠對以前的JSON數據進行反序列化處理:
Person info = json.create().fromJson(str2, Person.class); System.out.println(info);
因爲咱們以前重載了對應類的toString方法,所以其結果爲:
張三:23:男
另1個就是對以前新建的HashMap進行反序列化處理:
HashMap<?, ?> dict = json.create().fromJson(str, HashMap.class); System.out.println(dict);
其結果爲:
{gender=null, person=[張三, 李四]}
經過反序列化,在調用Jest時對於返回的數據,咱們就能夠進行篩選,去除一些不須要的內容再序列化返回到前端。
而Gson還有一些其餘的內容,好比對指定類型的序列化處理,這裏就不敘述了,能夠參考。
參考文章:
http://www.javadoc.io/doc/com...
https://www.cnblogs.com/mafly...
https://www.cnblogs.com/majay...