59

我正在寻找一个可以与 GWT 一起使用的 Java的简单Json (de)serializer。我搜索了一下,发现一些解决方案要么需要注释每个成员,要么定义无用的接口。挺无聊的。为什么我们没有一些非常简单的东西

class MyBean {
    ...
}

new GoodSerializer().makeString(new MyBean());
new GoodSerializer().makeObject("{ ... }", MyBean.class)
4

13 回答 13

56

看看 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());
于 2009-04-10T07:03:13.610 回答
38

要尝试的另一件事是 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).

于 2011-02-17T21:44:53.730 回答
12

最简单的方法是使用 GWT 的内置 JSON API。这是文档。这是一个关于如何使用它的很棒的教程。

就这么简单:

String json = //json string
JSONValue value = JSONParser.parse(json);

JSONValue API 非常酷。它允许您在从 JSON 对象中提取值时链接验证,以便在格式有任何问题时抛出异常。

于 2010-07-17T05:04:08.573 回答
11

看来我找到了问题的正确答案

我发现 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 内置类。

于 2009-03-26T08:05:45.720 回答
6

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 服务。

玩得开心。

于 2012-12-15T11:57:28.680 回答
5

检查这个:

GWT 专业 JSON 序列化器: http ://code.google.com/p/gwtprojsonserializer/

!适用于 GWT 2.0+!

于 2010-04-01T07:13:57.993 回答
3

json.org/java 这些天似乎包含在 GWT 中:

gwt-servlet-deps.jar\org\json\

或者,这个项目似乎很全面: http ://code.google.com/p/piriti/

于 2010-12-16T17:11:45.210 回答
2

在 Google Web Toolkit Applications 第 510 至 522 页中,作者 Ryan Dewsbury 展示了如何使用 GWT 代码生成来对 XML 和 JSON 文档进行序列化。

你可以在这里下载代码;您想要第 10 章的代码包,然后您想要查看 src/com/gwtapps/serialization 包。我没有看到此代码的许可证,但已通过电子邮件发送给作者以查看他所说的内容。如果他回复我会更新这个。

此解决方案的问题:

  • 你必须在你想要序列化的所有对象上添加一个标记接口(他使用 java.io.Serializable 但我想你可以使用其他对象——如果你使用 hibernate 作为后端,你的 pojos 可能已经被标记为这样) .
  • 代码只支持字符串属性;它可以延长。
  • 该代码仅针对 1.4 和 1.5 编写。

因此,这不是一个开箱即用的解决方案,而是构建适合 GWT 的 JSON 序列化程序的一个很好的起点。将它与服务器端的 JSON 序列化程序结合起来,比如json-lib,你就可以开始了。

我还找到了这个项目(同样,需要一些标记接口)。

于 2009-11-17T17:58:27.910 回答
1

从谷歌代码尝试这个序列化程序:http ://code.google.com/p/json-io/

如果您需要在 Java 中编写或读取 JSON 格式,这是可以使用的工具。无需创建额外的类等。一次调用即可将 Java 对象图转换为 JSON 格式。做相反的事情 - 创建一个 JSON 字符串或流到 Java 对象。这是我见过的最快的库。在大多数情况下,它比使用二进制格式的 ObjectOutputStream 和 ObjectInputStream 快。

非常方便的实用程序。

于 2010-10-21T21:07:25.110 回答
1

您可能想查看此项目https://gerrit.googlesource.com/gwtjsonrpc/

它是一个为支持 Android 代码审查系统 Gerrit 而创建的库,但它是一个独立模块,旨在嵌入到任何 GWT 项目中,而不仅仅是 Gerrit。

一个合理的教程可能是目录顶层的README 。它与标准 GWT RPC 非常相似,但它使用 JSON 编码。它还具有内置的 XSRF 保护。

于 2011-04-06T14:31:43.443 回答
0

我好像经常回答这个问题...

code.google.com 上有一个名为Using GWT for JSON Mashups的页面。(不幸的是)这超出了我的想象,因为我对 GWT 不太熟悉,所以它可能没有帮助。

于 2009-03-25T21:04:59.897 回答
-1

好的,我删除了我之前的答案,因为事实证明这正是您不想要的。

我不知道它与 GWT 的工作情况如何,但我们使用json-lib库来序列化我工作的普通 Java 项目中的对象。

它可以直接从 JavaBean 创建 JSONObject,然后使用生成的 JSONObject 的 toString() 方法来获取实际的 JSON 字符串。

同样,它也可以将JSON 转换回 JavaBean

于 2009-03-25T20:11:14.253 回答
-1

不确定杰克逊是否适合你。我不知道您是否正在寻找特定于 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()反序列化;可以用其他名称注释方法),仅此而已。

于 2009-03-26T02:45:44.583 回答