Получите доступ к глубоким объектам на карте, используя ключ как "item1.item1A" - PullRequest
0 голосов
/ 21 марта 2019

У меня есть несколько карт, ключи которых являются строками и его значениями Объекты (Map<String, Object>).Такими объектами могут быть другие карты, списки или литеральные значения (аналогично представлению JSON в памяти).Пример:

myMap = {
  "users": [
    {
      "name": "Foo",
      "surname": "Bar"
    },
    {
      "name": "John",
      "surname": "Doe"
    }
  ]
}

Я не хочу изобретать велосипед, поэтому мне было интересно, есть ли библиотека Java, которая позволила бы мне сделать что-то вроде этого:

String secondUserSurname = (String) myMap.get("users[1].surname");

Спасибо

РЕДАКТИРОВАТЬ: Чтобы уточнить, мне нужно выражение "users [1] .surname", чтобы быть строкой.Я хотел бы иметь эту структуру данных в памяти и выражение в файле .properties.Файл свойств скажет, к какому объекту обращаться на карте.Таким образом, я могу быстро изменить объект для доступа к изменению файла свойств, не изменяя код Java, который потребует развертывания, которое является дорогостоящим.

Ответы [ 2 ]

0 голосов
/ 25 марта 2019

Библиотека, которая позволяет мне получить доступ к этим объектам: JXPath , как указал Гиро Гирлис в комментариях, ему за это благодарны.

https://commons.apache.org/proper/commons-jxpath/

0 голосов
/ 21 марта 2019

Если у вас есть контент, доступный как String или bytes, то вы можете использовать любую библиотеку json для десериализации его в POJO и получения полей.Ниже приведен пример с Джексоном :

class UserObject {
    private List<User> users;

    public List<User> getUsers() {
        return users;
    }

    public void setUsers(List<User> users) {
        this.users = users;
    }
}

class User {
    private String name;
    private String surname;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getSurname() {
        return surname;
    }
    public void setSurname(String surname) {
        this.surname = surname;
    }
}

Код драйвера:

String content = "{" + 
        "  \"users\": [" + 
        "    {" + 
        "      \"name\": \"Foo\"," + 
        "      \"surname\": \"Bar\"" + 
        "    }," + 
        "    {" + 
        "      \"name\": \"John\"," + 
        "      \"surname\": \"Doe\"" + 
        "    }" + 
        "  ]" + 
        "}";

ObjectMapper objectMapper = new ObjectMapper();
UserObject userObject = objectMapper.readValue(content, UserObject.class);
System.out.println(userObject.getUsers().get(0).getSurname());
...