GWT Autobeans,将根级别解析为 Map 或 List

Posted

技术标签:

【中文标题】GWT Autobeans,将根级别解析为 Map 或 List【英文标题】:GWT Autobeans, parsing root-level as Map or List 【发布时间】:2012-03-20 21:26:01 【问题描述】:

Autobeans 非常强大。然而,在我的一生中,我无法弄清楚如何处理根级 JSON 映射或列表。

大部分文档都建议您有一个定义的***对象,该对象可以包含各种子对象(包括列表和地图),但没有关于自动生成地图或列表的文档。

public interface Types 
    List<FieldType> getTypes();


public interface TypesAutoBeanFactory extends AutoBeanFactory 
    AutoBean<Types> jsonItems();

以上是完成列表的参考方法,其中传入的数据将如下所示:

"types":[...,...]

然而,我觉得这很难看,REST 服务应该正确返回:

[...,...]

但我找不到使用 Autobean 框架处理此问题的简单方法。根级地图也是如此。

为什么这不起作用,是否有替代方法:

public interface TypesAutoBeanFactory extends AutoBeanFactory 
    AutoBean<List<FieldType>> jsonItems();

【问题讨论】:

【参考方案1】:

AutoBean 的工作原理是扫描您的类以查找 getset 方法(也可能是 is 方法)。 List 没有这些方法。

您可以编写一个补丁来将内部List 解析方法直接挂钩到AutoBeanCodex 的外部decode 方法 - 您需要的大部分代码都在其中。也许您可以添加decodeList(Splittable input) 而不是decode(Class type, Splittable input)。结果可能是一个实际的 List 而不是 AutoBean。

【讨论】:

我明白你的意思,尽管这些都不是相当干净的解决方案。第二种解决方案可能是两者中更好的一种。相反,我可能对可拆分列表中的每个对象进行解码,最终只返回列表。我还需要地图,但这可能会更棘手......仍有更多想法,但感谢您提供更好的方向。【参考方案2】:

我可以看到的另一种简单方法不是完全 autobean 解决方案。

很明显,如果字符串以[开头,则不是数组,所以我们可以使用

Object[] array = jsonString.replaceAll("[\[\]]","").split(",");

然后使用 autobean 处理数组元素。

【讨论】:

【参考方案3】:

我使用您描述的方法来解码包含单个键下的列表的 JSON 有效负载。

This answer 还解释了另一种方法,您可以将您提到的方法与未加密的 JSON 列表有效负载结合起来。

【讨论】:

以上是关于GWT Autobeans,将根级别解析为 Map 或 List的主要内容,如果未能解决你的问题,请参考以下文章

在 GWT 中将字符串转换为可拆分表

有没有办法降低 GWT AutoBean?

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

GWT Autobean 设置创建接口的初始值

当根节点有命名空间声明时,GXT 和 AutoBeans 能否处理 XML?

Apache XMLSchema 核心 XSD/XML 解析器将根元素显示为所有子元素的父元素,而不是其直接父元素