Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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 对象中的对象到具有反射的HashMap 项目:_Java_Oop_Reflection_Hashmap_Hierarchy - Fatal编程技术网

Java 对象中的对象到具有反射的HashMap 项目:

Java 对象中的对象到具有反射的HashMap 项目:,java,oop,reflection,hashmap,hierarchy,Java,Oop,Reflection,Hashmap,Hierarchy,我目前正在使用一个名为开发api的工具,因此要将对象导出为json,必须将对象转换为HashMap,为此,在父类中开发了一个方法来导出对象 方法: 公共地图导出(){ 对象obj=此; Map Map=newhashmap(); for(字段:obj.getClass().getDeclaredFields()){ 字段。setAccessible(true); 试一试{ map.put(field.getName(),field.get(obj)); }捕获(例外e){ //待办事项 } }

我目前正在使用一个名为开发api的工具,因此要将对象导出为json,必须将对象转换为HashMap,为此,在父类中开发了一个方法来导出对象

方法:
公共地图导出(){
对象obj=此;
Map Map=newhashmap();
for(字段:obj.getClass().getDeclaredFields()){
字段。setAccessible(true);
试一试{
map.put(field.getName(),field.get(obj));
}捕获(例外e){
//待办事项
}
}
返回图;
}
这是可行的,但仅适用于简单对象

我的问题是: 如果对象在我的方法中有复杂的对象,它也无法将它们导出到HashMap

示例结构:

公共抽象类主控{
公共地图<字符串,对象>
出口(){
对象obj=此;
MapMap=newhashmap<>();
for(字段:obj.getClass().getDeclaredFields()){
字段。setAccessible(true);
试一试{
map.put(field.getName(),field.get(obj));
}捕获(例外e){
//待办事项
}
}
返回图;
}
}
公共类Foo扩展Master{
私人INTA;
私人INTB;
私有字符串c;
私人酒吧;
//...
}
公共类Bar扩展到Master{
私人int q;
私人int w;
私有字符串e;
//...
}
我这样使用它:

return new Bar(/*data*/).export();
输出:

{
  "a": 2,
  "b": 5,
  "c": "abc",
  "bar": "myproject.myPackage.Bar@XXXXX"
}
预期产出:

{
  "a": 2,
  "b": 5,
  "c": "abc",
  "bar": {
    "q": 10,
    "w": 15,
    "e": "it works"
  }
}

你需要决定一个值应该直接放在映射中还是递归。因此,您可以使用以下简单方法:

private boolean isSimpleType(Class<?> type) {
    return type.isPrimitive() ||
            Boolean.class == type ||
            Character.class == type ||
            CharSequence.class.isAssignableFrom(type) ||
            Number.class.isAssignableFrom(type) ||
            Enum.class.isAssignableFrom(type);
}
您还可以调整此项以执行
export
方法

您的示例的结果如下:

{a=2, b=5, bar={q=10, e=it works, w=15}, c=abc}
除此之外,我强烈建议使用一个库(比如),它已经完美地完成了类似的工作。以下是使用Jackson的相同解决方案:

Map result = new ObjectMapper().convertValue(object, Map.class);
或者,如果您需要类型安全:

ObjectMapper mapper = new ObjectMapper();
MapType mapType = mapper.getTypeFactory().constructMapType(Map.class, String.class, Object.class);
Map<String, Object> result = mapper.convertValue(value, mapType);
ObjectMapper mapper=new ObjectMapper();
MapType MapType=mapper.getTypeFactory().constructMapType(Map.class、String.class、Object.class);
映射结果=mapper.convertValue(值,映射类型);

有些库也会给你想要的结果(将一个对象序列化为JSON/将JSON反序列化为一个对象),比如Gson/Jackson/plunting more,也许还有什么需要研究的?你可以添加一个条件if field.get(obj)是Master cast to Master和put in map export方法result的实例,但正如马克·梅特所说,有些图书馆也有这样的功能functionality@Mark感谢这些库:),但我尽量不使用它们,以免破坏我框架的标准
ObjectMapper mapper = new ObjectMapper();
MapType mapType = mapper.getTypeFactory().constructMapType(Map.class, String.class, Object.class);
Map<String, Object> result = mapper.convertValue(value, mapType);