在java中检索嵌套json中的所有键

这是我写的程序:

/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package javaapplication1; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import java.util.StringTokenizer; import net.sf.json.JSONException; import net.sf.json.JSONObject; /** * * @author 311001 */ public class NewClass { public static void main(String args[]) { JSONObject parentData = new JSONObject(); JSONObject childData = new JSONObject(); try { parentData.put("command", "login"); parentData.put("uid", "123123123"); childData.put("uid", "007"); childData.put("username", "sup"); childData.put("password", "bros"); parentData.put("params", childData); System.out.println(parentData); Map map = new HashMap(); Iterator iter = parentData.keys(); while (iter.hasNext()) { String key = (String) iter.next(); String value = parentData.getString(key); map.put(key, value); } for (Entry entry : map.entrySet()) { System.out.println("key > " + entry.getKey() + " : value = " + entry.getValue()); } String testData = map.get("params.uid"); System.out.println(testData); System.out.println("Tokenizing json"); String resultStr = parentData.toString(); System.out.println("String tokens "); StringTokenizer st = new StringTokenizer(resultStr); System.out.println(st.countTokens()); while (st.hasMoreTokens()) { System.out.println(st.nextToken()); } String testDat="abc :: result"; StringTokenizer simpleString = new StringTokenizer(testDat); System.out.println("Tokenizing simple string"); System.out.println(simpleString.countTokens()); while (simpleString.hasMoreTokens()) { System.out.println(simpleString.nextToken()); } } catch (JSONException e) { e.printStackTrace(); } } } 

我得到的输出:

 run: {"command":"login","uid":"123123123","params":{"uid":"007","username":"sup","password":"bros"}} key > uid : value = 123123123 key > command : value = login key > params : value = {"uid":"007","username":"sup","password":"bros"} null Tokenizing json String tokens 1 {"command":"login","uid":"123123123","params":{"uid":"007","username":"sup","password":"bros"}} Tokenizing simple string 3 abc :: result BUILD SUCCESSFUL (total time: 0 seconds) 

我怎样才能收到json对象中的所有键。 如果我标记化为什么我只得到一个字符串标记,而对于一个简单的字符串我得到正确的输出3标记。

您可以递归遍历JsonObject以获取所有键。 inheritance了伪代码

 findKeys(JsonObject obj,List keys){ ListkeysFromObj=obj.keys(); keys.addAll(keysFromObj); for(String key:keysFromObj){ if(obj.get(key).getClass()==JSONObject.class){ findKeys(obj.get(key),keys); } } } 

所以假设你的对象是{“a”:1,“b”:{“c”:“你好”,“d”:4.0}}上面的函数应该给你[“a”,“b”,“c ”, “d”]

但如果你只想要[“a”,“c”,“d”]作为输出,你可以写 –

 findKeys(JsonObject obj,List keys){ ListkeysFromObj=obj.keys(); for(String key:keysFromObj){ if(obj.get(key).getClass()==JSONObject.class){ findKeys(obj.get(key),keys); }else{ keys.add(key); } } } 

这是使用org.json 而不是org.json.simple的一个实现

它使用java查找具有Key:value组合的json的所有唯一值。

输入json:

 { d: { results: [{ __metadata: { uri:https://google.com, type: User }, userId: jmarthens1, businessPhone: null, salaryProrating: null, empId: 2023, lastModifiedDateTime: Date(1458308558000 + 0000), finalJobRole: null, username: jmarthens, married: false, futureLeader: null, salary: 79000.0, jobRole: Program Manager, Professional Services, nickname: null, salaryLocal: null }] } } 

结果:

 empId-2023 lastModifiedDateTime-Date(1458308558000+0000) salary-79000.0 userId-jmarthens1 jobRole-Program Manager, Professional Services type-User uri-https://google.com username-jmarthens 

码:

 package test; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; public class TestClass { private static StringBuilder strOut = new StringBuilder(); public static void main(String[] args) { try { String json = "{\"d\" : {\"results\" : [{\"__metadata\" : {\"uri\" : \"https://apisalesdemo8.successfactors.com:443/odata/v2/User('jmarthens1')\"," + " \"type\" : \"SFOData.User\"}, \"userId\" : \"jmarthens1\", \"businessPhone\" : null, \"salaryProrating\" : null, \"empId\" : \"2023\", " + "\"lastModifiedDateTime\" : \"Date(1458308558000+0000)\", \"finalJobRole\" : null, \"username\" : \"jmarthens\", \"married\" : false, " + "\"futureLeader\" : null, \"salary\" : \"79000.0\", \"jobRole\" : \"Program Manager, Professional Services\", \"nickname\" : null, \"salaryLocal\" : null}]}}"; JSONObject inputJson = new JSONObject(json); List lst = new ArrayList(); lst = findKeysOfJsonObject(inputJson, lst); try (BufferedWriter writer = new BufferedWriter(new FileWriter("C:\\temp\\temp.txt"))) { writer.write(strOut.toString()); } } catch (JSONException | IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } private static List findKeysOfJsonArray(JSONArray jsonIn, List keys) { List keysFromArr = new ArrayList<>(); if (jsonIn != null && jsonIn.length() != 0) { for (int i = 0; i < jsonIn.length(); i++) { JSONObject jsonObjIn = jsonIn.getJSONObject(i); keysFromArr = findKeysOfJsonObject(jsonObjIn, keys); } } return keysFromArr; } private static List findKeysOfJsonObject(JSONObject jsonIn, List keys) { Iterator itr = jsonIn.keys(); List keysFromObj = makeList(itr); keys.addAll(keysFromObj); itr = jsonIn.keys(); while (itr.hasNext()) { String itrStr = itr.next(); // System.out.println("out " + itrStr); JSONObject jsout = null; JSONArray jsArr = null; if (jsonIn.get(itrStr).getClass() == JSONObject.class) { jsout = jsonIn.getJSONObject(itrStr); findKeysOfJsonObject(jsout, keys); } else if (jsonIn.get(itrStr).getClass() == JSONArray.class) { jsArr = jsonIn.getJSONArray(itrStr); keys.addAll(findKeysOfJsonArray(jsArr, keys)); } else if (jsonIn.get(itrStr).getClass() == String.class) { System.out.println(itrStr + "-" + jsonIn.get(itrStr)); strOut.append(itrStr + "," + jsonIn.get(itrStr)); strOut.append(System.lineSeparator()); } } return keys; } public static List makeList(Iterator iter) { List list = new ArrayList(); while (iter.hasNext()) { list.add(iter.next()); } return list; } } 
 static Set finalListOfKeys = new LinkedHashSet(); public static void main(String[] args) { JSONParser parser = new JSONParser(); try { Object obj = parser.parse(new FileReader("Absolute path of json file")); JSONObject jsonObject = (JSONObject) obj; Set jsonKeys = jsonObject.keySet(); for (String key : jsonKeys) { Object val = jsonObject.get(key); if (val instanceof JSONArray) { JSONArray array = (JSONArray) val; jsonArray(array, key); } else if (val instanceof JSONObject) { JSONObject jsonOb = (JSONObject) val; jsonObj(jsonOb, key); } else { finalListOfKeys.add(key); System.out.println("Key is : " + key); } } System.out.println("Final List : " + finalListOfKeys); } catch (Exception e) { e.printStackTrace(); } } public static void jsonObj(JSONObject object, String key2) { Set innerKeys = object.keySet(); System.out.println("Inner Keys : " + innerKeys); for (String key : innerKeys) { System.out.println("Key : " + key); Object val = object.get(key); if (val instanceof JSONArray) { JSONArray array = (JSONArray) val; jsonArray(array, key2 + "->" + key); } else if (val instanceof JSONObject) { JSONObject jsonOb = (JSONObject) val; jsonObj(jsonOb, key2 + "->" + key); } else { finalListOfKeys.add(key2 + "->" + key); System.out.println("Key is : " + key2 + "->" + key); } } } public static void jsonArray(JSONArray array, String key) { if (array.size() == 0) { finalListOfKeys.add(key); } else { for (int i = 0; i < array.size(); i++) { Object jObject = array.get(i); if (jObject instanceof JSONObject) { JSONObject job = (JSONObject) jObject; System.out.println(job); jsonObj(job, key); } } } }