class MyBean {
...
}
new GoodSerializer().makeString(new MyBean());
new GoodSerializer().makeObject("{ ... }", MyBean.class)
class MyBean {
...
}
new GoodSerializer().makeString(new MyBean());
new GoodSerializer().makeObject("{ ... }", MyBean.class)
看一下GWT的覆盖类型。我认为这是在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 的接口和 factory 来提供它们,然后 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。它使用自定义Generator类,并且对于每个“jsonable” bean都需要一个卫星接口。不幸的是,它在最新版本的GWT上不能正常工作,需要打补丁,并且长时间没有更新过。
所以,我个人认为让我的Beans知道如何自行转换为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
是 GWT 内置的类,提供低级别的 JSON 支持。
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);
最近GWT似乎已经包含了json.org/java:
gwt-servlet-deps.jar\org\json\
或者,这个项目似乎很全面: http://code.google.com/p/piriti/
你可能想要查看这个项目 https://gerrit.googlesource.com/gwtjsonrpc/
这是一个库,旨在支持 Android 的代码审查系统 Gerrit,但它是一个独立的模块,可以嵌入到任何 GWT 项目中,而不仅仅是 Gerrit。
一个合理的教程可能是目录顶层的 README。它与标准的 GWT RPC 相似,但使用 JSON 编码。它还具有内置的 XSRF 保护。
尝试使用来自Google Code的此序列化程序:http://code.google.com/p/json-io/
如果您需要在Java中编写或读取JSON格式,这是要使用的工具。无需创建额外的类等。通过一次调用将Java对象图转换为JSON格式。反之亦然-创建JSON字符串或流以获取Java对象。这是我见过的最快的库,用于执行此操作。在大多数情况下,它比使用二进制格式的ObjectOutputStream和ObjectInputStream更快。
非常方便的实用程序。