Json < – >与GWT一起工作的Java序列化

我正在寻找一个简单的 Json(德)序列化器的Java可能与GWT的工作。 我GOOGLE了一下,发现了一些解决scheme,要么需要注释每个成员或定义无用的接口。 非常无聊。 为什么我们没有像这样简单的东西呢?

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

看看GWT的覆盖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; }-*/; } 

一旦定义了覆盖types,就很容易从JSON创build一个JavaScript对象并访问其在Java中的属性:

 public static final native Customer buildCustomer(String json) /*-{ return eval('(' + json + ')'); }-*/; 

如果要再次使用对象的JSON表示,则可以将覆盖types包装在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的内置JSON API。 这里是文档 。 这里有一个关于如何使用它的好教程 。

这很简单:

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

JSONValue API非常酷。 当你从JSON对象中提取值的时候,它可以让你链接validation,这样如果有任何与格式不符的情况,就会抛出exception。

似乎我find了正确的答案来回答我的问题

我想通过json和json把bean转换成GWT并不是一件容易的事情。 已知的库不起作用,因为GWT将需要完整的源代码,并且此源代码必须仅使用由GWT模拟的Java类。 另外,你不能在GWT中使用reflection。 非常苛刻的要求!

我发现唯一现有的解决scheme名为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支持。

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

祝你有美好的时光

检查这个:

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包。 我没有看到这个代码的许可证,但通过电子邮件发送给作者看他说什么。 如果他回复,我会更新。

这个解决scheme的问题:

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

所以,这不是一个开箱即用的解决scheme,而是一个开发适合GWT的JSON序列化程序的好起点。 把它与服务器端的JSON序列化程序结合起来,就像json-lib一样 ,你很好。

我也发现这个项目 (再次,一些标记界面是必需的)。

试试Google代码中的这个序列化程序: http : //code.google.com/p/json-io/

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

非常方便的实用程序。

我似乎正在回答这个问题很多…

code.google.com上有一个标题为“ 使用GWT for JSON混搭 ”的页面。 这是(不幸)我的头,因为我不熟悉GWT,所以它可能没有帮助。

你可能想结账这个项目https://gerrit.googlesource.com/gwtjsonrpc/

这是一个为了支持Android Gerrit代码审查系统而创build的库,但它是一个独立的模块,可以embedded到任何GWT项目中,而不仅仅是Gerrit。

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

好吧,我删除了我以前的答案,因为事实certificate,这正是你不想要的。

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

它可以直接从JavaBean创buildJSONObject ,然后使用生成的JSONObject的toString()方法获取实际的JSONstring。

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

不知道jackson会为你工作。 我不知道是否有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()来反序列化;可以使用其他名称来注释方法),但这是关于它的。