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

时间:2017-04-23 11:11:48

标签: java json mongodb

{
    "empId":"1",
    "name":"Alex",
    "role":"president",
    "phone":"123",
    "address": {
        "street":"xyz",
        "city":"hyd",
        "pincode":400123
    }
}

我想按照以下方式检索密钥,以便我可以允许用户在UI中选择这样的密钥。

keys: ["empId","name","role","phone", "address", "address.street", "address.city", 
"address.pincode"]

同样可以用于直接查询Mongo。我尝试使用JSONObject并获取密钥,但我无法获取文档及其来自的路径。

请告诉我是否有直接使用Java的方式,或者Mongo是否有办法从所在的地方获取所有密钥

2 个答案:

答案 0 :(得分:1)

你可以使用递归来做到这一点。

以下是一个例子:

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变量,用于存储先前级别的先前键。

答案 1 :(得分:0)

您可以创建其他阵列并推送该阵列中的所有键。

使用JSON.Stringyfy函数将其作为字符串呈现给最终用户。

var keys = [],

sourceArray = [{
    "empId":"1",
    "name":"Alex",
    "role":"president",
    "phone":"123",
    "address": {
        "street":"xyz",
        "city":"hyd",
        "pincode":400123
    }
}]; //Test data

$.each(sourceArray, function(k, v) {
    //k is the key and v is the value (key-value pair)
    keys.push(k);
});

//You have all the keys - use at your disposal

注意:我没有在没有源代码的情况下测试此代码,请根据您的实际代码进行验证和修改。