在 GWT 上使用 AutoBean 解析未知类型的 JSON 对象

Posted

技术标签:

【中文标题】在 GWT 上使用 AutoBean 解析未知类型的 JSON 对象【英文标题】:Parsing JSON objects of unknown type with AutoBean on GWT 【发布时间】:2012-02-10 20:47:13 【问题描述】:

我的服务器以 JSON 格式返回对象列表。例如,它们可能是 Cats 或 Dogs。

当我知道他们都将是Cats 时,我可以将AutoBeanCodex 设置为轻松工作。但是,当我不知道它们是什么类型时……我该怎么办?

我可以给我的所有实体一个类型字段,但是我必须先解析每个实体,然后再将它传递给AutoBeanCodex,这接近于失败。我还有哪些其他选择?

【问题讨论】:

【参考方案1】:

前几天刚开始玩这个,打了几个小时,尝试了@Category方法和其他方法,直到我发现:你可以创建一个Splittable类型的属性,它代表底层传输对布尔值/字符串/列表/映射有一些编码的类型。就我而言,我知道一些在设计时通过线路传输的包络类型,并且基于其他一些属性,其他一些字段可以是任意数量的其他 autobeans。

您甚至不需要在编译时知道其他 bean 的类型,您可以使用 Splittable 的方法获取值,但是如果仍然使用 autobeans,最好定义包装的数据.

interface Envelope 
  String getStatus();
  String getDataType();
  Splittable getData();

(如果您在接收数据的同时发送数据,则可能需要设置器 - 将 bean 编码为 `Splittable 以在信封中发送它比解码它更容易)

通过网络发送的 JSON 被解码(可能使用 AutoBeanCodex)为 Envelope 类型,并且在您决定必须从 getData() 方法中输出什么类型之后,调用类似这样的方法来获取嵌套对象输出

SpecificNestedBean bean = AutoBeanCodex.decode(factory, 
                                               SpecificNestedBean.class, 
                                               env.getData()).as();

Envelope 类型和嵌套类型(在上面的factory 中)甚至不需要是相同的AutoBeanFactory 类型。这可以让您从通用传输实例中抽象出信封的读/写,并为每个 dataType 字符串属性使用特定的工厂来解码数据的模型(和嵌套模型)。

【讨论】:

以上是关于在 GWT 上使用 AutoBean 解析未知类型的 JSON 对象的主要内容,如果未能解决你的问题,请参考以下文章

GWT Autobean JSON 规范

序列化为 GWT AutoBean 时如何保留 LinkedHashMap 的顺序?

如何在 GWT 中使用 autobean 将 json 转换为 java 类

在 gwt 中支持 autobean 包装的原因是啥

如何序列化 AutoBean (GWT) 中的列表?

没有设置方法的 GWT Autobean