当前位置:  开发笔记 > 前端 > 正文

Json < - >与GWT一起使用的Java序列化

如何解决《Json<->与GWT一起使用的Java序列化》经验,为你挑选了6个好方法。

我正在寻找一个可以与GWT一起使用的简单的Java Json(de)序列化程序.我已经google了一下,发现了一些解决方案要么需要注释每个成员,要么定义无用的接口.相当无聊.为什么我们没有像这样简单的东西

class MyBean {
    ...
}

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

Chris Kentfi.. 55

看看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端那样在java端使用相同的对象表示.但我还没有找到更好的反序列化解决方案. (2认同)

我相信最好的方法是注释getter并在编译时生成(de)序列化方法 (2认同)


小智.. 38

另一件需要尝试的是GWT 2.1引入的新AutoBean框架.

您可以为bean和工厂定义接口,GWT会为您生成实现.

interface MyBean {
  String getFoo();
  void setFoo(String foo);
}

interface MyBiggerBean {
  List getBeans();
  void setBeans(List beans>;
}

interface Beanery extends AutoBeanFactory{
  AutoBean makeBean();
  AutoBean makeBigBean();
}

Beanery beanFactory = GWT.create(Beanery.class);

void go() {
  MyBean bean = beanFactory.makeBean().as();
  bean.setFoo("Hello, beans");
}

该AutoBeanCodex可用于它们序列,并从JSON.

AutoBean autoBean = AutoBeanUtils.getAutoBean(bean);
String asJson = AutoBeanCodex.encode(autoBean).getPayload();

AutoBean autoBeanCloneAB = 
  AutoBeanCodex.decode(beanFactory, MyBean.class, asJson );

MyBean autoBeanClone = autoBeanCloneAB.as(); 
assertTrue(AutoBeanUtils.deepEquals(autoBean, autoBeanClone));

它们也在服务器端工作 - AutoBeanFactoryMagic.create(Beanery.class)而不是使用GWT.create(Beanery.class).



1> Chris Kentfi..:

看看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端那样在java端使用相同的对象表示.但我还没有找到更好的反序列化解决方案.
我相信最好的方法是注释getter并在编译时生成(de)序列化方法

2> 小智..:

另一件需要尝试的是GWT 2.1引入的新AutoBean框架.

您可以为bean和工厂定义接口,GWT会为您生成实现.

interface MyBean {
  String getFoo();
  void setFoo(String foo);
}

interface MyBiggerBean {
  List getBeans();
  void setBeans(List beans>;
}

interface Beanery extends AutoBeanFactory{
  AutoBean makeBean();
  AutoBean makeBigBean();
}

Beanery beanFactory = GWT.create(Beanery.class);

void go() {
  MyBean bean = beanFactory.makeBean().as();
  bean.setFoo("Hello, beans");
}

该AutoBeanCodex可用于它们序列,并从JSON.

AutoBean autoBean = AutoBeanUtils.getAutoBean(bean);
String asJson = AutoBeanCodex.encode(autoBean).getPayload();

AutoBean autoBeanCloneAB = 
  AutoBeanCodex.decode(beanFactory, MyBean.class, asJson );

MyBean autoBeanClone = autoBeanCloneAB.as(); 
assertTrue(AutoBeanUtils.deepEquals(autoBean, autoBeanClone));

它们也在服务器端工作 - AutoBeanFactoryMagic.create(Beanery.class)而不是使用GWT.create(Beanery.class).



3> Eric Nguyen..:

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

这很简单:

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

JSONValue API非常酷.它允许您在从JSON对象中提取值时链接验证,以便在格式错误的情况下抛出异常.



4> amartynov..:

我似乎找到了正确的答案

我发现在GWT中bean到json和json到bean的转换并不是一项简单的任务.已知的库不起作用,因为GWT需要完整的源代码,并且此源代码必须仅使用由GWT模拟的Java类.此外,您不能在GWT中使用反射.非常艰难的要求!

我找到了唯一一个名为gwt-jsonizer的解决方案.它使用自定义的Generator类,并且每个"jsonable"bean都需要一个卫星接口.遗憾的是,如果没有修补最新版本的GWT,它就无法工作,并且很长时间没有更新.

因此,我个人认为让我的豆子如何将自己转换为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支持.



5> Saeed Zarinf..:

RestyGWT是一个功能强大的库,用于在GWT中将Java Object编码或解码为JSON:

import javax.ws.rs.POST;
...
public interface PizzaOrderCodec extends JsonEncoderDecoder {
}

然后:

// 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服务.

祝你玩得愉快.



6> 小智..:

检查一下:

GWT Professional JSON Serializer:http: //code.google.com/p/gwtprojsonserializer/

!与GWT 2.0+一起使用!

推荐阅读
可爱的天使keven_464
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有