關於為什麼突然會使用Java,實際上還是公司要將之前原先Python開發的Elasticsearch搜尋整合到到專案中,而必須在國慶前給出1個版本。真心的說,進度很趕,對於一個平時不怎麼寫Java的Pythoner來說,花了1天的時間把對應的功能完成的70%,不得不說是1個奇蹟。
在Jest包中,有這麼1個Gson的包,用於對JSON資料進行序列化處理。這裡我們單獨將其拿出來,稍微簡單的介紹一下,以後遇到同樣的問題的時候也不用慌。這裡使用的gson版本為2.8.0
。
我們使用maven下載了對應的包後,首先進行如下的操作:
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);
}
}
其結果如下所示:
{"person":["張三","李四"]}
可以說是1個非常簡單的例子。但是上面的方式,對於數值為null的情況會忽略掉對應的鍵名,如下所示:
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);
其結果為:
{"person":["張三","李四"]}
此時我們可以使用如下的方式進行序列化:
GsonBuilder json = new GsonBuilder();
String str = json.serializeNulls().create().toJson(map);
另外,預設的序列化是沒有美化效果的,看起來不是很方便,此時我們可以新增setPrettyPrinting
方法來設定其為美化的輸出:
String str = json.serializeNulls().setPrettyPrinting().create().toJson(map);
相應的結果立即就變成了:
{
"gender": null,
"person": [
"張三",
"李四"
]
}
除此之外,我們還可以對類進行例項化,比如我們有如下1個簡單的類:
class Person {
private String name = "張三";
private int age = 23;
private String gender = "男";
@Override
public String toString(){
return name + ":" + age + ":" + gender;
}
}
接著我們再進行例項化處理:
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…