在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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/349751.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NOIP模拟测试15「建造城市city(插板法)·轰炸·石头剪刀布」

建造城市 题解 先思考一个简单问题 10个$toot$ 放进5间房屋,每个房屋至少有1个$toot$,方案数 思考:插板法,$10$个$toot$有$9$个缝隙,$5$间房屋转化为$4$个挡板,放在toot缝隙之间得到$C_{9}^{4}$ 10个$toot$…

弹簧和线程:TaskExecutor

在Web应用程序中使用线程并不常见,尤其是当您必须开发长期运行的任务时。 考虑到spring,我们必须格外注意并使用它已经提供的工具,而不是生成我们自己的线程。 我们希望线程由spring管理,因此能够在不产生任何影响的情况下使用应…

数位dp从会打模板到不会打模板

打了几个数位$dp$&#xff0c;发现自己除了会打模板之外没有任何长进&#xff0c;遇到非模板题依然什么都不会 那么接下来这篇文章将介绍如何打模板&#xff08;滑稽&#xff09; 假设我们要处理$l----r$ 采用记忆化搜索的方式&#xff0c;枚举$<r$每一种情况&#xff0c;枚…

javafx简单吗_JavaFX即将推出您附近的Android或iOS设备吗?

javafx简单吗已经有大新闻最近在世界上的JavaFX的关于JavaFX的是许多更多的组件开源&#xff0c;开源的广告在2012 JavaOne大会 。 在2月的开放源代码更新中 &#xff0c; Richard Bair编写了一份JavaFX项目表&#xff0c;该表在撰写本文时&#xff08;2013年2月11日&#xff0…

【webrtc】webrtc的rtp重传代码分析

pgm不太能用&#xff0c;没有想象中的可靠&#xff0c;重传机制貌似仍然使用组播重传&#xff0c;丢包率80%的网络感觉没啥改进&#xff0c;如果有所好转延迟估计也是个不小的问题。 后听说rtp也有nack机制&#xff0c;webrtc基于rtp实现了重传在一定程度上保证可靠性。 在各路…

了解java.nio.file.Path – 1

介绍 Java的最后几个发行版本&#xff0c;即Java 7&#xff0c;Java 8和即将到来的Java 9&#xff0c;具有许多功能&#xff0c;这些功能使Java开发人员的生活更加轻松。 &#xff08;我知道Java 9会使它变得更困难&#xff0c;但是只有在您采用新的范例时才可以。之后&#xf…

socket-01

对于所有的Web应用&#xff0c;本质上其实就是一个socket服务端&#xff0c;用户的浏览器其实就是一个socket客户端 转载于:https://www.cnblogs.com/yanhuaqiang/p/11329925.html

ActionScript3学习笔记2-包

在 ActionScript 3.0 中&#xff0c;包是用命名空间实现的&#xff0c;但包和命名空间并不同义。在声明包时&#xff0c; 可以隐式创建一个特殊类型的命名空间并保证它在编译时是已知的。显式创建的命名空间在 编译时不必是已知的。 下面的示例使用 package 指令来创建一个包含…

grep v grep_使用grep4j轻松测试分布式组件上的SLA

grep v grep因此&#xff0c;您的分布式体系结构如下图所示&#xff0c;您刚刚从企业那里收到了一项要求&#xff0c;以确保生产者发送并随后传输到下游系统&#xff08;消费者&#xff09;的消息的SLA必须快且永远不会慢于此。 400毫秒。 要求说&#xff1a; 从生产者发送到…

得到指定进程所有窗口。显示 影藏 置顶。

这里使用一个外挂程序测试&#xff0c;因为外挂程序没有做功能限制的处理 只是做了 窗口影藏。 全局变量 HWND hwnd[100]{0};int number0;DWORD Tpid0; 局部变量 char username[1028]; 先找到进程ID 1 HWND SelectPor() 2 { 3 bool isYesfalse; 4 string porcessName&q…

jquery部分方法

offset([coordinates]) 概述&#xff1a;获取匹配元素在当前视口的相对偏移。返回的对象包含两个整型属性&#xff1a;top 和 left。此方法只对可见元素有效。 比如&#xff0c;获取第二段的偏移&#xff1a; HTML 代码: <p>Hello</p><p>2nd Paragraph</p…

JUnit 5扩展模型的生命周期

JUnit5最终版本即将来临 &#xff08;当前是M4&#xff09;&#xff0c;我已经开始研究如何编写扩展。 在JUnit5中 &#xff0c;您没有使用Runners &#xff0c; Rules &#xff0c; ClassRules等&#xff0c;而是只有一个Extension API来实现自己的扩展。 JUnit5提供了多个接…

让IE6、IE7、IE8支持CSS3

我们都知道IE6&#xff0c;7并不支持CSS3的属性&#xff0c;IE8也不能很好的支持CSS3。但是有一个小脚本能够做到&#xff0c;它可以让IE支持 CSS3&#xff0c;包括&#xff1a;border-radius (rounded), box-shadow ( shadow), text-shadow等…… 如果你需要一个支持CSS3 的bo…

NOIP模拟测试16「Drink·blue·weed」

话说这次考试 Drink 非常棒的一道卡常练习题&#xff0c;适合练习卡常 真的很棒 前置卡常知识 1.char要比int快 char是最快的 输出putchar&#xff0c;输入getchar 在这个题快了7000豪 2.read 快读非常棒&#xff0c;让你变得更快&#xff0c;fread更棒&#xff0c;fread会爆炸…

Spring Boot Web Slice测试–示例

春天开机推出 测试切片而回&#xff0c;它已经采取了一些时间来解决它我的头&#xff0c;并探讨一些细微的差别。 背景 使用此功能的主要原因是减少样板。 考虑一个看起来像这样的控制器&#xff0c;仅适用于使用Kotlin编写的各种控制器。 RestController RequestMapping(&qu…

DECODE函数

DECODE函数相当于一条件语句(IF),它将输入数值与函数中的参数列表相比较&#xff0c;根据输入值返回一个对应值。函数的参数列表是由若干数值及其对应结果值组成的若干序偶形式。当然&#xff0c;如果未能与任何一个实参序偶匹配成功&#xff0c;则函数也有默认的返回值。区别于…

多线程练习

写两个线程&#xff0c;其中一个线程打印1-52&#xff0c;另一个线程打印A-Z&#xff0c;打印顺序应该是12A34B56C......5152Z。 该习题需要用到多线程通信的知识。 思路分析&#xff1a; 把打印数字的线程称为线程N&#xff0c;打印字母的线程称为线程L. 1.线程N完成打印后&am…

java jee curd_Java / JEE中的有效日志记录–映射的诊断上下文

java jee curd这一切始于当我和一位同事坐在一起解决一些应用程序问题时&#xff0c;当我注意到一些有趣的事情时。 他正在合并代码&#xff0c;我的眼睛吸引了此类“ org.apache.log4j.MDC”的注意。 这导致了以下发现&#xff1a; 什么是MDC&#xff1f; MDC代表“ 映射诊断…

Learning Cocos2d-x for WP8(7)——让Sprite动起来

C#(wp7)兄弟篇Learning Cocos2d-x for XNA&#xff08;7&#xff09;——让Sprite动起来 本讲将详细介绍Cocos2d-x游戏中动画Animate的创建方式&#xff0c;通过逐帧数组播放动画和创建动画集合播放动画&#xff0c;比较两者的异同&#xff0c;让Sprite动起来。 工程文件&#…

GWT的渐进式Web应用程序配方

渐进或不渐进… 如果您一段时间以来一直在设计或开发Web应用程序&#xff0c;那么您可能会遇到无数次“渐进式Web应用程序”一词&#xff0c;并且在未来几年内可能会这样做。 您可能想知道PWA的确切定义是什么&#xff0c;如何识别PWA&#xff0c;以及如何构建PWA。 根据字典&a…