【发布时间】:2019-05-20 17:57:41
【问题描述】:
项目:
我目前正在使用一个名为Netuno的工具来开发一个api,所以要将对象导出为json,需要将对象转换为HashMap,为此在父类中开发了一个方法导出对象。
方法: public Map<String, Object> export() {
Object obj = this;
Map<String, Object> map = new HashMap<>();
for (Field field : obj.getClass().getDeclaredFields()) {
field.setAccessible(true);
try {
map.put(field.getName(), field.get(obj));
} catch (Exception e) {
//todo e
}
}
return map;
}
这有效,但仅适用于简单对象。
我的问题:
如果对象在我的方法中包含复杂对象,它也无法将它们导出到 HashMap。
示例结构:
public abstract class Master {
public Map < String, Object >
export () {
Object obj = this;
Map < String, Object > map = new HashMap < > ();
for (Field field: obj.getClass().getDeclaredFields()) {
field.setAccessible(true);
try {
map.put(field.getName(), field.get(obj));
} catch (Exception e) {
//todo e
}
}
return map;
}
}
public class Foo extends Master {
private int a;
private int b;
private String c;
private Bar bar;
//...
}
public class Bar extends Master {
private int q;
private int w;
private String 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"
}
}
【问题讨论】:
-
有些库也可以为您提供您想要的结果(将对象序列化为 JSON/将 JSON 反序列化为对象),例如 Gson/Jackson/更多,也许需要研究一下?跨度>
-
如果 field.get(obj) 是 Master cast to master 的实例,您可以添加一个条件并放入地图导出方法结果,但正如 Mark 提到的,有一些库具有该功能
-
@Mark 感谢这些库 :),但我试图不使用它们来不破坏我的框架标准
标签: java oop reflection hashmap hierarchy