java - 我们如何从 JSON 文档中检索所有键及其前缀

标签 java json mongodb

{
    "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/

相关文章:

java - 软件设计原理 : Seperate your collection from working on an object?

json - 使用现有字段作为 mongodb 中的 objectId 来使用 Node 和 Express 创建 REST api?

javascript - 使用 Node 导出服务器生成 png 图表时出现意外标记

python - 如何在 pymongo 中使用 find_one 获取最新记录

java - spring boot mongodb审计报错

java - 如何在 Java 中存储对数组?

java - 单元测试抛出异常

mongodb - service mongodb start 和 mongod 有什么区别

java - 通过 Google Spreadsheet API 添加标题

javascript - Ajax 为每个表单提交添加一个额外的帖子