{
"empId":"1",
"name":"Alex",
"role":"president",
"phone":"123",
"address": {
"street":"xyz",
"city":"hyd",
"pincode":400123
}
}
我想按如下方式检索 key ,以便允许用户在 UI 中选择此类 key 。
keys: ["empId","name","role","phone", "address", "address.street", "address.city",
"address.pincode"]
同样可以直接在Mongo上查询。我尝试使用 JSONObject 并获取 key ,但无法获取文档及其来源路径。
请告诉我是否有可以在 Java 中使用的直接方法,或者 Mongo 是否有办法从来源处获取所有 key
最佳答案
您可以使用递归来做到这一点。
这是一个例子:
public static void main(String[] args) throws ParseException {
String str = "{ \"empId\":\"1\", \"name\":\"Alex\", \"role\":\"president\", \"phone\":\"123\", \"address\": { \"street\":\"xyz\", \"city\":\"hyd\", \"pincode\":400123 }}";
JSONObject obj = (JSONObject) new JSONParser().parse(str);
List<String> keysList = new ArrayList<>();
recLevels(keysList, obj, "");
System.out.println(keysList);
}
public static void recLevels(List<String> keysList, JSONObject obj, String prefix) {
Set<String> keys = (Set<String>) obj.keySet();
for (String key : keys) {
keysList.add(prefix + (prefix.isEmpty() ? "" : ".") + key);
if (obj.get(key) instanceof JSONObject) {
recLevels(keysList, (JSONObject) obj.get(key), prefix + (prefix.isEmpty() ? "" : ".") + key);
}
}
}
什么是recLevels
方法的作用是遍历对象的所有键,并检查这些键中是否有一个对象作为其值 if (obj.get(key) instanceof JSONObject)
,如果是的话 recLevels
为该对象再次调用,并为该对象重复该过程(向下一级)。
这里重要的部分是prefix
用于存储先前级别的先前键的变量。
关于java - 我们如何从 JSON 文档中检索所有键及其前缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43570401/