GWT 客户端:Java 对象到 json 字符串,反之亦然
Posted
技术标签:
【中文标题】GWT 客户端:Java 对象到 json 字符串,反之亦然【英文标题】:GWT client side : Java object to json string and vice versa 【发布时间】:2014-03-14 19:58:15 【问题描述】:这可能是一个重复的问题,但我无法找到解决方案。 我有一些复杂的 java 对象,我想将它序列化为 json 字符串,然后我想将它从 GWT 客户端传递给 Rest Web 服务。为了调用其他 Web 服务,我使用的是 RequestBuilder 类或 RPC 代理。 问题是我一直无法找到将 Object 转换为 json 的解决方案 我尝试使用 AutoBean 框架,但我在堆栈溢出的某个地方读到它非常错误。我要转换的对象可以是任何内置的 Java 可序列化对象 String、HashMap、ArrayList,也可以是自定义 POJO 对象。我正在从事的项目非常大,我想要一个强大的解决方案。 我试过这个
AutoBean<HashMap> bean = AutoBeanUtils.getAutoBean(myMap);
return AutoBeanCodex.encode(bean).getPayload();
这是返回空字符串
【问题讨论】:
Using Gson library in GWT client code你可以解决这个问题 GSON 不能在 Clientcode 中工作。 (如果最近几个月没有变化) @Braj 正如 ChristianKuetbach 已经提到的,虽然 bGWTGson github.com/heroandtn3/bGwtGson 有一个库,但 GSon 将无法工作,这也是在后端使用 RPC 架构。 但这会为序列化创建客户端服务器通信。 【参考方案1】:AutoBean 可以序列化 Lists 和 Maps,但是只有当你有一个你知道的***接口时。
使用 JSON 和 GWT(据我所知)无法简单地序列化所有类型的可序列化。
GWT-RPC 可以完成这项工作,因为它会在编译时生成代码并且可以访问 Java-Reflection API。
我不知道任何能够序列化每个 Serializable
对象的 GWT 客户端代码兼容 JSON 序列化器。
【讨论】:
从技术上讲,AutoBeans 还在编译时生成代码并使用反射来计算出什么是可访问的/有意义的,但这进一步意味着 rpc 和 autobeans 都不能处理他们没有被告知的任意对象的。如果不编译所有可能的类型和所有字段元数据,就不能教 gwt 项目序列化任何任意 Object 子类。您可以编译所有这些,但它可能会严重增加编译后的应用程序大小。【参考方案2】:经过一段时间的努力 我终于想到的解决方案。 我使用 GWT RPC 代理来调用休息服务。 在我的 impl 类中,我使用 jackson 来序列化对象,而不是使用 Jersey 客户端 API,我使用的是休息服务,而不是再次反序列化响应并将其传递给客户端。这是迄今为止我能想到的最好的解决方案。 Jackson 和 jersey 是生产就绪的库。 这样我有两个好处。 1.我不必弄乱客户端代码。 2. 跨域rest call是可能的(SOP限制)。
欢迎提出任何建议。
希望对你有帮助
【讨论】:
【参考方案3】:我见过使用这个库最成功和最少的代码:
https://code.google.com/p/gwtprojsonserializer/
除了所有 Object 类都应该有的标准 toString() 之外,我在每个我想要“JSONable”的类中也有一个叫做 toJsonString() 的东西。注意,每个类都必须继承库自带的JsonSerializable:
public String toJsonString()
Serializer serializer = (Serializer) GWT.create(Serializer.class);
return serializer.serializeToJson(this).toString();
为了将 JSON 字符串转回对象,我在同一个类中放置了一个静态方法,该方法会重新创建该类本身:
public static ClassName recreateClassViaJson(String json)
Serializer serializer = (Serializer) GWT.create(Serializer.class);
return (ClassName) serializer.deSerialize(json, "full.package.name.ClassName");
非常简单!
【讨论】:
仅仅发布图书馆的链接是没有用的!试着举一个使用它的例子。以上是关于GWT 客户端:Java 对象到 json 字符串,反之亦然的主要内容,如果未能解决你的问题,请参考以下文章
GWT(客户端)=如何将对象转换为 JSON 并发送到服务器?