嵌套 Java HashMap 的动态变量键



我是Java的新手。

我需要使用其键路径从Nested HashMap获取 HashMap 值,并且键是一个动态变量。

例如,HashMap 是

{data={
        "owner" : {
            "id" : 34,
            "firstName" : "John",
            "lastName" : "Smith",
            "owner" : {
                "id" : 44,
                "firstName" : "Henrick",
                "lastName" : "kane"
            },
        },
        "fname" : "sahal",
        "lname" : "kn",
    }
}

我得到像data.owner.owner.iddata.owner.idfname这样的钥匙。因此,密钥路径的长度可以是任意数字。上面的例子是431。它可以是 5、6 或 7 个任意。键是动态的,所以我无法预测达到最后一个键值的长度。

有没有办法动态拉取哈希图值,如下所示的列表 myHashMaoVariable.get("data.owner.owner.id");

现在我将密钥data.owner.id拆分为列表和检查
if key[0] > 1 and myHashMaoVariable.containsKey(key[0]), if key[1] > 1 and myHashMaoVariable.get(key[0]).containsKey(key[1]), if key[2] > 1 and myHashMaoVariable.get(key[0]).get(key[1]).containsKey(key[1]),依此类推,直到密钥长度 5。

有没有更好的方法来支持n个键路径长度?此外,嵌套映射也没有depth。它也是动态的。

假设你有一个顶级地图:

Map<String, Object> rootMap = ...//obtain map

您可以定义一个动态读取特定级别的值的方法:

static Object readKeyValue(String keyPath, Map<String, Object> root) {
    String[] keys = keyPath.split("\.");
    Object value = root.get(keys[0]);
    for (int i = 1; i < keys.length; i++) {
        if (i == keys.length - 1) {
            return ((Map<String, Object>) value).get(keys[i]);
        } else {
            value = ((Map<String, Object>) value).get(keys[i]);
        }
    }
    return value;
}

使用这样的方法,您可以通过以下方式调用它:

Object value = readKeyValue("data.owner.owner.id", rootMap);

使用以下主要方法进行测试:

public static void main(String[] args) {
    Map<String, Object> rootMap = new HashMap<>(), data = new HashMap<>(), owner1 = new HashMap<>(),
            owner2 = new HashMap<>();
    rootMap.put("data", data);
    data.put("owner", owner1);
    owner1.put("owner", owner2);
    owner2.put("firstName", "something");
    System.out.println(rootMap);
    System.out.println(readKeyValue("data.owner.owner.firstName", rootMap));
}

并产生了以下输出:

{data={owner={owner={firstName=something}}}}
something

最新更新