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 的工作原理是扫描您的类以查找 get
和 set
方法(也可能是 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 中使用 autobean 将 json 转换为 java 类