2012-03-02 60 views
2

目前,我有一类设置为一个autobean进行处理:如何使用GWT Autobeans处理动态JSON数据?

public interface Asset extends Hit { 
    String getGuid(); 
    String getHitType(); 
    Map<String,Serializable> getMetadata(); 
} 

我尝试使用对象,而不是Serializable接口

Map<String,Object> getMetadata() 

但这似乎炸毁试图访问数据时(因为它不是'实现')。

元数据映射可能包含其他映射,字符串,整数等。如何从该元数据对象的内部映射中检索数据?

目前,如果我打电话给asset.getMetadata()。get(“title”);这将返回一个SerializableAutoBean,并且对该对象执行toString()或String.valueOf(obj)将返回内存对象信息,而不是实际的字符串值。

AutoBean对象可以是动态的吗?还是您需要专门定义每个字段?

+0

好了之后,我发现我可以将我的元数据映射到字符串,可拆分。其中Splittable允许我检索驱动自动更新的数据,并且可以根据需要对其进行递归。虽然不是很干净,特别是当涉及到列表时。 – 2012-03-02 21:18:10

+2

正如您的注释,“Splittable”适用于此,甚至可以允许序列化对象在另一个“AutoBeanFactory”中编码。 (更多关于此:http://stackoverflow.com/questions/9234601/parsing-json-objects-of-unknown-type-with-autobean-on-gwt)它确实增加了一个额外的解析行,您可以在其中指定要解码的对象的类型,但是在一个甚至可以是优点的循环中 - 你可以在同一个列表中有几种不同类型的对象,并且使用分割表的方法来请求一个给定的属性来获取类型的数据每。 – 2012-03-02 21:47:54

回答

0

在Java泛型或RTTI意义上,AutoBeans不是“动态”的。

在GWT中,所有类型都必须在编译时就知道自动生成的任何东西(包括AutoBean)。这对您的设计施加了限制,不允许您充分利用Java的语言功能(特别是泛型和其他RTTI功能)。所以,在RTTI或Java通用意义上,AutoBeans不是动态的。但是,AutoBeans只是一种低级包装数据的方式,您仍然可以使用Splittables访问数据!

如前面的注释所述,您可以使用Splittables作为JSON对象的类型在序列化/解码时未知的部分。当然,让所有事情都立即发生是件好事,但没有任何东西阻止你对数据对象执行一些后期处理,使它们进入你想要的状态。

对于某人来说,“使用AutoBeans(以及其他任何自动生成的东西)发生的事情的一个好方法是查看生成的代码。 maven的默认位置是:${project.build.directory}/.generated

如果你在编译之后看看那里,你应该找到GWT编译器为你的AutoBean生成的代码。