Как я могу преобразовать объект в Map<String, String> где key равно obj.parameter.name, а value равно obj.parameter.value

Например: Object obj = new myObject("Joe", "Doe"); преобразовать в Map с ключами: имя, фамилия и значения: Джо, Доу.

8
Dmytro Svarychevskyi 19 Сен 2018 в 15:59

2 ответа

Лучший ответ

Вот как бы вы это сделали:

import java.util.Map;
import java.util.HashMap;
import java.util.Map.Entry;
import java.lang.reflect.Field;

public class Main {
    public int a = 3;
    public String b = "Hello";

    public static void main(String[] args) {
        Map<String, Object> map = parameters(new Main());
        for (Entry<String, Object> entry : map.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }
    }

    public static Map<String, Object> parameters(Object obj) {
        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) { }
        }
        return map;
    }
}

По сути, вы используете отражение, чтобы получить все поля в классе. Затем вы получаете доступ ко всем этим полям объекта. Имейте в виду, что это работает только для полей, доступных из метода, который получает поля.

2
HyperNeutrino 19 Сен 2018 в 13:24

Помимо хитрого решения с использованием отражения, вы также можете попробовать jackson с одной строкой, как показано ниже:

objectMapper.convertValue(o, Map.class);

Тестовый пример:

    @Test
    public void testConversion() {
        User user = new User();
        System.out.println(MapHelper.convertObject(user));
    }

    @Data
    static class User {
        String name = "Jack";
        boolean male = true;
    }


// output: you can have the right type normally
// {name=Jack, male=true}
2
Hearen 10 Ноя 2019 в 12:48