我正在寻找一个 简单的 适用于 Java 的 Json(反)序列化器,可能与 GWT 一起使用。我用谷歌搜索了一下,发现一些解决方案要么需要注释每个成员,要么定义无用的接口。相当无聊。为什么我们不做一些非常简单的事情,比如

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());

其他提示

要尝试的另一件事是新的 AutoBean 框架介绍与GWT 2.1。

您定义接口为您的豆类和一个工厂,售货他们,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的内置JSON API。这里是文档。这里是href="http://gwttutorials.com/2009/07/27/parsing-json-with-gwt/" rel="noreferrer">如何使用它伟大的教程一个

这是像这样简单:

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

在JSONValue API相当凉爽。它可以让你连锁验证,你提取的JSON对象值,以便将异常如果有任何的不妥的格式被抛出。

看来,我找到了正确的回答我的问题。

我想通了豆到JSON和JSON来在GWT豆转换不是一个简单的任务。已知库是行不通的,因为GWT将要求其全部源代码,这些源代码只能使用那些由amoung GWT模拟Java类。此外,您不能在GWT使用反射。非常严格的要求!

我发现名为 GWT-jsonizer 现有的唯一解决方案。它使用了自定义发电机类,并要求每个“jsonable”豆卫星接口。不幸的是,它并没有打补丁的GWT的最新版本,并在相当长的时间一直没有更新工作。

所以,我个人决定,这是更便宜,速度更快,使我的豆子KHOW如何将自己转换为从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 是用于编码或解码Java对象到JSON在GWT一个功能强大的库:

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来使用REST Web服务。

有一个很好的时间。

检查这样的:

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

!与GWT 2.0作品+!

json.org/java似乎包括与GWT这些天:

GWT-servlet的deps.jar \有机\ JSON \

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

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

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

此解决方案的问题:

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

因此,这不是一个开箱即用的解决方案,但对于构​​建适合 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,格里特代码审查系统中创建一个库,但它的意思是嵌入到任何GWT项目,而不仅仅是一个格里特独立模块。

一个合理教程可能是自述中的顶层目录。这是相当类似于标准的GWT RPC但它使用JSON编码。它还内置了XSRF保护。

OK,我删除了我以前的答案,因为它原来是你不想要什么。

我不知道它有多好作品与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()反序列化;可以标注与其他名称的方法),但仅此而已。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top