Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用GWT Autobeans处理动态JSON数据?_Java_Gwt_Gxt_Autobean - Fatal编程技术网

Java 如何使用GWT Autobeans处理动态JSON数据?

Java 如何使用GWT Autobeans处理动态JSON数据?,java,gwt,gxt,autobean,Java,Gwt,Gxt,Autobean,目前,我有一个类设置要作为autobean处理: public interface Asset extends Hit { String getGuid(); String getHitType(); Map<String,Serializable> getMetadata(); } 公共接口资产扩展Hit{ 字符串getGuid(); 字符串getHitType(); 映射getMetadata(); } 我尝试使用Object而不是Serializab

目前,我有一个类设置要作为autobean处理:

public interface Asset extends Hit {
    String getGuid();
    String getHitType();
    Map<String,Serializable> getMetadata();
}
公共接口资产扩展Hit{
字符串getGuid();
字符串getHitType();
映射getMetadata();
}
我尝试使用Object而不是Serializable:

Map<String,Object>  getMetadata()
Map getMetadata()
但当试图访问数据时(因为它不是“具体化的”)这似乎会爆炸

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

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

AutoBean对象可以是这样的动态对象吗,或者您必须明确定义每个字段吗?

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

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

正如前面的注释所述,您可以对JSON对象中在序列化/解码时类型未知的部分使用Splittables。当然,让所有事情同时发生会很好,但是没有什么可以阻止您对数据对象执行一些后处理,以使它们进入所需的状态

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

如果在编译后查看,您应该会找到GWT编译器为您的AutoBeans生成的代码。

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

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

正如前面的注释所述,您可以对JSON对象中在序列化/解码时类型未知的部分使用Splittables。当然,让所有事情同时发生会很好,但是没有什么可以阻止您对数据对象执行一些后处理,以使它们进入所需的状态

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


如果在编译后查看,您应该会找到GWT编译器为您的AutoBeans生成的代码。

询问之后,我发现我可以将元数据映射到String,Splittable。其中Splittable允许我检索驱动autobean的数据,并且我可以根据需要在其上递归。但是不是很干净,特别是当涉及列表时。正如您的注释所述,
Splittable
可以实现这一点,甚至可以允许序列化对象在另一个
AutoBeanFactory
中编码。(更多信息:)它确实增加了一行额外的解析,您可以指定要解码对象的类型,但在循环中,这甚至可能是一个优势-您可以在同一个列表中有多个不同类型的对象,并使用Splittable的方法向给定属性询问每个对象类型的数据。询问之后,我发现我可以将元数据映射到字符串Splittable。其中Splittable允许我检索驱动autobean的数据,并且我可以根据需要在其上递归。但是不是很干净,特别是当涉及列表时。正如您的注释所述,
Splittable
可以实现这一点,甚至可以允许序列化对象在另一个
AutoBeanFactory
中编码。(更多信息:)它确实添加了一行额外的解析,您可以在其中指定要解码对象的类型,但在循环中,这甚至可能是一个优势-您可以在同一列表中有多个不同类型的对象,并使用Splittable的方法向给定属性询问每个对象类型的数据。