Вы должны решить, следует ли мне указать значение на карте или рекурсивно. Поэтому вы можете использовать простой метод, подобный этому:
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);
}
Этот метод возвращает true
для всех примитивных типов или объектов Wrapper, Strings и Enums. Вы можете просто настроить эти методы в соответствии с вашими потребностями. Посмотрите здесь для более подробной информации о том, как определить, является ли класс простым.
Теперь вы можете использовать для преобразования объекта:
public Map<String, Object> convert(Object object) {
Map<String, Object> map = new HashMap<>();
for (Field field : object.getClass().getDeclaredFields()) {
field.setAccessible(true);
try {
if (isSimpleType(field.getType())) {
map.put(field.getName(), field.get(object));
} else {
map.put(field.getName(), convert(field.get(object)));
}
} catch (Exception e) {
e.printStackTrace();
}
}
return map;
}
Вы также можете отрегулировать это, чтобы использовать свой export
метод.
Результат для вашего примера будет таким:
{a=2, b=5, bar={q=10, e=it works, w=15}, c=abc}
Кроме того, я настоятельно рекомендую использовать библиотеку (например, Джексон ), которая уже совершенствует подобные вещи. Вот то же решение с использованием Джексона:
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);