我正在寻找一个可以与 GWT 一起使用的 Java的简单Json (de)serializer。我搜索了一下,发现一些解决方案要么需要注释每个成员,要么定义无用的接口。挺无聊的。为什么我们没有一些非常简单的东西
class MyBean {
...
}
new GoodSerializer().makeString(new MyBean());
new GoodSerializer().makeObject("{ ... }", MyBean.class)
我正在寻找一个可以与 GWT 一起使用的 Java的简单Json (de)serializer。我搜索了一下,发现一些解决方案要么需要注释每个成员,要么定义无用的接口。挺无聊的。为什么我们没有一些非常简单的东西
class MyBean {
...
}
new GoodSerializer().makeString(new MyBean());
new GoodSerializer().makeObject("{ ... }", MyBean.class)
看看 GWT 的Overlay Types。我认为这是迄今为止在 GWT 中使用 JSON 最简单的方法。这是链接文章中修改后的代码示例:
public class Customer extends JavaScriptObject {
public final native String getFirstName() /*-{
return this.first_name;
}-*/;
public final native void setFirstName(String value) /*-{
this.first_name = value;
}-*/;
public final native String getLastName() /*-{
return this.last_name;
}-*/;
public final native void setLastName(String value) /*-{
this.last_name = value;
}-*/;
}
一旦定义了覆盖类型,就很容易从 JSON 创建一个 JavaScript 对象并在 Java 中访问它的属性:
public static final native Customer buildCustomer(String json) /*-{
return eval('(' + json + ')');
}-*/;
如果您想再次使用 JSON 表示对象,可以将覆盖类型包装在 JSONObject 中:
Customer customer = buildCustomer("{'Bart', 'Simpson'}");
customer.setFirstName("Lisa");
// Displays {"first_name":"Lisa","last_name":"Simpson"}
Window.alert(new JSONObject(customer).toString());
要尝试的另一件事是 GWT 2.1 引入的新AutoBean框架。
您为您的 bean 和一个出售它们的工厂定义接口,然后 GWT 为您生成实现。
interface MyBean {
String getFoo();
void setFoo(String foo);
}
interface MyBiggerBean {
List<MyBean> getBeans();
void setBeans(List<MyBean> beans>;
}
interface Beanery extends AutoBeanFactory{
AutoBean<MyBean> makeBean();
AutoBean<MyBiggerBean> makeBigBean();
}
Beanery beanFactory = GWT.create(Beanery.class);
void go() {
MyBean bean = beanFactory.makeBean().as();
bean.setFoo("Hello, beans");
}
AutoBeanCodex可用于将它们与 json 进行序列化。
AutoBean<MyBean> autoBean = AutoBeanUtils.getAutoBean(bean);
String asJson = AutoBeanCodex.encode(autoBean).getPayload();
AutoBean<MyBean> autoBeanCloneAB =
AutoBeanCodex.decode(beanFactory, MyBean.class, asJson );
MyBean autoBeanClone = autoBeanCloneAB.as();
assertTrue(AutoBeanUtils.deepEquals(autoBean, autoBeanClone));
它们也在服务器端工作——使用AutoBeanFactoryMagic.create(Beanery.class)
而不是GWT.create(Beanery.class)
.
看来我找到了问题的正确答案
我发现 GWT 中的 bean 到 json 和 json 到 bean 的转换并不是一项简单的任务。已知库将无法工作,因为 GWT 需要它们的完整源代码,并且该源代码必须仅使用 GWT 模拟的 Java 类。此外,您不能在 GWT 中使用反射。非常苛刻的要求!
我找到了唯一一个名为gwt-jsonizer的现有解决方案。它使用一个自定义生成器类,并且每个“jsonable”bean 都需要一个附属接口。不幸的是,不打最新版的GWT就不行,而且很久没有更新了。
因此,我个人认为让我的 bean 知道如何将自己转换为 json 和从 json 转换更便宜、更快捷。像这样:
public class SmartBean {
private String name;
public String getName() { return name; }
public void setName(String value) { name = value; }
public JSONObject toJson() {
JSONObject result = new JSONObject();
result.put("name", new JSONString(this.name));
return result;
}
public void fromJson(JSONObject value) {
this.name = value.get("name").isString().stringValue();
}
}
JSONxxxx
是提供低级 json 支持的 GWT 内置类。
RestyGWT是一个强大的库,用于在 GWT 中将 Java 对象编码或解码为 JSON:
import javax.ws.rs.POST;
...
public interface PizzaOrderCodec extends JsonEncoderDecoder<PizzaOrder> {
}
然后:
// GWT will implement the interface for you
PizzaOrderCodec codec = GWT.create(PizzaOrderCodec.class);
// Encoding an object to json
PizzaOrder order = ...
JSONValue json = codec.encode(order);
// decoding an object to from json
PizzaOrder other = codec.decode(json);
它还有几个易于使用的 API 用于使用 Restful Web 服务。
玩得开心。
json.org/java 这些天似乎包含在 GWT 中:
gwt-servlet-deps.jar\org\json\
或者,这个项目似乎很全面: http ://code.google.com/p/piriti/
在 Google Web Toolkit Applications 第 510 至 522 页中,作者 Ryan Dewsbury 展示了如何使用 GWT 代码生成来对 XML 和 JSON 文档进行序列化。
你可以在这里下载代码;您想要第 10 章的代码包,然后您想要查看 src/com/gwtapps/serialization 包。我没有看到此代码的许可证,但已通过电子邮件发送给作者以查看他所说的内容。如果他回复我会更新这个。
此解决方案的问题:
因此,这不是一个开箱即用的解决方案,而是构建适合 GWT 的 JSON 序列化程序的一个很好的起点。将它与服务器端的 JSON 序列化程序结合起来,比如json-lib,你就可以开始了。
我还找到了这个项目(同样,需要一些标记接口)。
从谷歌代码尝试这个序列化程序:http ://code.google.com/p/json-io/
如果您需要在 Java 中编写或读取 JSON 格式,这是可以使用的工具。无需创建额外的类等。一次调用即可将 Java 对象图转换为 JSON 格式。做相反的事情 - 创建一个 JSON 字符串或流到 Java 对象。这是我见过的最快的库。在大多数情况下,它比使用二进制格式的 ObjectOutputStream 和 ObjectInputStream 快。
非常方便的实用程序。
您可能想查看此项目https://gerrit.googlesource.com/gwtjsonrpc/
它是一个为支持 Android 代码审查系统 Gerrit 而创建的库,但它是一个独立模块,旨在嵌入到任何 GWT 项目中,而不仅仅是 Gerrit。
一个合理的教程可能是目录顶层的README 。它与标准 GWT RPC 非常相似,但它使用 JSON 编码。它还具有内置的 XSRF 保护。
我好像经常回答这个问题...
code.google.com 上有一个名为Using GWT for JSON Mashups的页面。(不幸的是)这超出了我的想象,因为我对 GWT 不太熟悉,所以它可能没有帮助。
好的,我删除了我之前的答案,因为事实证明这正是您不想要的。
我不知道它与 GWT 的工作情况如何,但我们使用json-lib库来序列化我工作的普通 Java 项目中的对象。
它可以直接从 JavaBean 创建 JSONObject,然后使用生成的 JSONObject 的 toString() 方法来获取实际的 JSON 字符串。
同样,它也可以将JSON 转换回 JavaBean。
不确定杰克逊是否适合你。我不知道您是否正在寻找特定于 GWT 的产品;如果不是,它应该工作。
但是它的序列化/反序列化效果很好,比如:
// read json, create object
ObjectMapper mapper = new ObjectMapper();
MyBean bean = mapper.readValue(jsonAsString, MyBean.class);
// and write out
StringWriter sw = new StringWriter();
mapper.writeValue(sw, user);
String jsonOut = sw.toString();
您确实需要访问器(getX()
序列化、setX()
反序列化;可以用其他名称注释方法),仅此而已。