{
"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是否有办法从所在的地方获取所有密钥
答案 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
注意:我没有在没有源代码的情况下测试此代码,请根据您的实际代码进行验证和修改。