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相关推荐

  1. 敏捷中gwt含义_在GWT中序列化/反序列化Json

    敏捷中gwt含义 JSON和GWT 最近, GWT用户小组中进行了有趣的讨论 ,涉及在客户端对JSON进行序列化/反序列化的最佳实践. 这篇文章旨在突出其重点. 到目前为止,在GWT中有三种将对象转换 ...

  2. java rest 序列化_http请求/restful/序列化反序列化/JSON

    1.为什么要实现Serializable (1)将内存中的对象数据存在磁盘中持久化 (2)将对象从一个应用程序发送到另一个应用程序 实现Serializable接口可以把对象序列化为字节流,实现传输必 ...

  3. json序列化c语言,C语言JSON序列化/反序列化

    最近想找一个C语言处理嵌套结构体和结构体数组的json库,理想的是能够很容易处理复杂结构体嵌套,并且使用简单的,但是没找到比较合适的,于是打算自己封装一个: 两个问题: C语言结构体本身没有元数据,这 ...

  4. js反序列化html编码,JavaScript实现的反序列化json字符串操作示例

    本文实例讲述了JavaScript实现的反序列化json字符串操作.分享给大家供大家参考,具体如下: JavaScript中如何反序列化json字符串呢? 有如下两种方法: (1) 使用万能的eval ...

  5. 【JavaScript】在JavaScript中使用JSON进行序列化/反序列化操作

    文章目录 用于stringfy/parse操作的"JSON"对象 JavaScript中简单数据类型的JSON序列化操作 使用toJSON()进行对象的序列化操作 使用eval() ...

  6. .Net 中关于序列化和反序列化Json的方法

    .Net SDK中关于序列化和反序列化Json的方法 项目中遇到和服务端交互时需要传递数据包为json格式的包,所以在服务端和SDK中都需要对json进行解析和组合的操作, 并且对一些复杂结构的jso ...

  7. JavaScript中的JSON序列化/反序列化

    JSON 1. JSON简介 2. JSON与JS Object区别 3. 对象序列化 3.1 JSON序列化 3.2 JSON反序列化 1. JSON简介 JSON(JavaScript Objec ...

  8. Java 中序列化与反序列化

    一. 序列化和反序列化概念 Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是一种将这些字节重建成一个对象的过程.将程序中的对象,放入文 ...

  9. windows phone 中反序列化json时出现的问题

    原先的项目是做的WP8版本,后来因为需求要改成WP7,一开始用的Newtonsoft.Json.dll便一直出错. 猜想有可能是WP项目版本不同造成的,就找到了WP7.1专用的,仍然出错:无法使用方法 ...

最新文章

  1. mysql半连接_mysql表的半连接,反连接导致的mysql性能优化剖析
  2. 通过圆的颜色并结合霍夫变换检测目标圆的OpenCV代码
  3. 开源图像检索项目PicSearch is now an open source project
  4. maven 不编译jasper文件_第一个SpringBoot项目、核心配置文件properties(yml、yaml)、集成jsp...
  5. PostgreSQL MySQL 兼容性之 - bit 函数和操作符
  6. C# hashtable
  7. 管理服务器一般的作用,管理服务器作用
  8. C语言的EOF是什么?getchar()!=EOF返回的是什么?
  9. linux c 多线程终止耗时长的任务,Linux C:从main()返回是否导致多线程应用程序终止?...
  10. MYSQL 的集群
  11. 大家的芝麻信用分都是多少?
  12. mineData地图添加自定义Maker图标
  13. 爱河许云上计算机乐谱,神马乐团爱河简谱
  14. 10月17号PC端云音乐项目总结
  15. 多人对战中国象棋文档
  16. centos ntp日志_centos NTP服务器配置总结
  17. 信息与计算机科学讲座,【创新创业 计科在行动】2015级信息与计算科学专业大学生创新讲座、专业教育讲座暨学术前沿讲座专题报道...
  18. 人机交互选择判断练习题
  19. 如何在Ubuntu 20.04上使用Seafile同步和共享文件
  20. 如何删除电脑计算机用户名和密码,如何删除电脑设置的密码

热门文章

  1. DevOps通用及版本控制面试题
  2. Shell入门(四)之数组
  3. C++描述杭电OJ 2017.字符串统计||
  4. 第6章循环结构(二)
  5. 银行营业网点管理系统——implt包(CityAreaDaoImpl )
  6. 多线程的线程通信(生产消费)
  7. android 按键消息,在android中模拟键盘消息(shell命令的方法)
  8. git 合并冲突_git分支管理的策略和冲突问题
  9. springboot2.5.5配置druid数据源1.2.8与jdbc
  10. gradle 构建 Smack 报错:Can't find android.jar for 8 API. + steps for building android platform