首页 > 解决方案 > 使用“item1.item1A”之类的键访问地图中的深层对象

问题描述

我有几个映射,它们的键是字符串,它的值是 Objects ( 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 代码。

标签: javamapskey

解决方案


如果您有可用的内容,String那么bytes您可以使用任何json库将其反序列化为 aPOJO并获取字段。下面是杰克逊的一个例子:

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());

推荐阅读