日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

在GWT中序列化/反序列化Json

發布時間:2023/12/3 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。