在GWT中序列化/反序列化Json
JSON和GWT
最近, GWT用戶小組中進行了有趣的討論 ,涉及在客戶端對JSON進行序列化/反序列化的最佳實踐。 這篇文章旨在突出其重點。 到目前為止,在GWT中有三種將對象轉換為JSON并從客戶端轉換回JSON的方法:
gwt-jackson框架:
gwt-jackson包裝了著名的杰克遜圖書館的某些功能。 它允許使用稱為ObjectMapper的接口轉換對象。 使用gwt-jackson的優勢在于,它可以序列化諸如Collections和Maps之類的復雜對象。 它還允許使用@JsonProperty和@JsonCreator之類的注釋進行花式轉換。 gwt-jackson的唯一遺憾是它使用了Generators ,在GWT 3.0版中將棄用該工具。 還值得注意的是RestyGWT使用了gwt-jackson,這是從客戶端發出HTTP請求的替代方法之一。
可以在Github頁面上找到示例: https : //github.com/nmorel/gwt-jackson/tree/master/examples
使用JavaScriptObject:
這是傳統方法之一。 JavaScriptObject利用JSNI創建一個普通的JS對象。 它可以擴展并具有cast()方法,該方法允許將對象“安全”投射到其子類型。 可以使用JsonUtils.stringify()方法將JavaScriptObject轉換為JSON字符串,也可以使用JsonUtils.safeEval()將其轉換回JSON字符串。 JavaScriptObject與代表JavaScriptObject集合的JsArray協同工作,并擴展了JavaScriptObject。 該方法的唯一缺點是與創建對象相關聯的樣板。 例如:
public class Person extends JavaScriptObject {//Constructor needs to be protected and zero-argumentsprotected Person() { }// JSNI is used for setting/getting properties public final native String getFirstName() /*-{ return this.FirstName; }-*/;public final native String getLastName() /*-{ return this.LastName; }-*/;public final native void setFirstName(String firstName) /*-{ this.FirstName = firstName; }-*/;public final native void setLastName(String lastName) /*-{ this.LastName = lastName; }-*/; }然后:
Person person = JavaScriptObject.createObject().cast();JsArray array = JavaScriptObject.createArray().cast();person.setFirstName("first Name");person.setLastName("last Name");array.push(person);GWT.log(JsonUtils.stringify(person));GWT.log(JsonUtils.stringify(array));結果:
{"FirstName":"first Name","LastName":"last Name"} [{"FirstName":"first Name","LastName":"last Name"}]使用JsInterop批注:
JsInterop批注允許將Java類型/類視為Javascript對象,并允許向/從應用程序Js環境導出或導入功能。 一些GWT項目成員( Thomas Broyer , Jens Nehlmeier )推薦使用JsInterop,因為JsInterop是GWT未來的重要組成部分,它將成為處理GWT中Javascript對象的主要方式。 使用JsInterop的唯一缺點是Elemental 2仍處于實驗階段,因此直到它變得穩定為止。 開發人員最好將自己的代碼片段用于本地Javascript實用程序(例如Json類),例如:
@JsType(isNative=true, namespace=GLOBAL) public class JSON {public native static String stringify(Object obj);public native static Object parse(String obj);}如果我們的對象看起來像:
@JsType(isNative=true, namespace=GLOBAL, name="Object") public class Record {String id;String date;String data;public Record() {}}然后 :
Record record = new Record();record.id = "1";record.date = "20";record.data = "30";String json = JSON.stringify(recod);GWT.log(json); // Result: {"id":"1","date":"20","data":"30"}autorest -gwt (也是進行HTTP調用的選項之一)使用JsInterop在發出HTTP請求之前對對象進行序列化/序列化。
重要的是要注意 ,地圖不是由JSON.stringify()方法處理的,嘗試對地圖進行字符串化會引發以下錯誤:
Map mapTest = new HashMap();mapTest.put("v1", "v2");mapTest.put("v3", "v4");GWT.log(JSON.stringify(mapTest));Uncaught TypeError: Converting circular structure to JSON轉換諸如ArrayList之類的Collection不會引發任何錯誤,但是會創建開發人員希望擺脫的其他JSON字段:
List test2 = new ArrayList();test2.add(record2);test2.add(record);GWT.log(JSON.stringify(test2));結果:
{"array_3_g$":[{"id":"1","date":"50","data":"90"},{"id":"1","date":"20","data":"30"}]}GWT編譯器出于某種原因添加了“ array_3_g $”,因此用戶需要找到一種方法來將其刪除以進行干凈的轉換,例如:
{[{"id":"1","date":"50","data":"90"},{"id":"1","date":"20","data":"30"}]}到目前為止,Plain Arrays是唯一可以正確轉換的結構。
帶走
在這三種方法中,JsInterop似乎是處理JSON的最可行方法。 目前主要關注的是處理諸如Collections和Maps之類的對象,這些對象需要開發人員進行進一步的手動處理。 Plain Arrays是目前唯一可以正確轉換的結構,因此開發人員可以嘗試簡化或轉換為Plain Arrays進行干凈轉換。
JavaScriptObject提供了自己的使用JsArray處理“列表”的方式。 現在,gwt-jackson仍然是提供開箱即用的“收藏夾”和“地圖”轉換的唯一選項。
翻譯自: https://www.javacodegeeks.com/2017/07/serializingdeserializing-json-gwt.html
總結
以上是生活随笔為你收集整理的在GWT中序列化/反序列化Json的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 内联调用深度_Java中内联虚
- 下一篇: wps行统计(wps表格做数据统计)