How do I get a list of all JSON paths to values from a JSON String?

后端 未结 2 1025
死守一世寂寞
死守一世寂寞 2021-01-01 00:28

My goal is to read a JSON file and understand the location of all the values, so that when I encounter that same JSON, I can easily read all the values. I am looking for a w

相关标签:
2条回答
  • 2021-01-01 00:49

    Refer to this utility : https://github.com/wnameless/json-flattener Perfect answer to your requirement. Provides Flattened map and Flattened strings for complex json strings. I am not the author of this but have used it successfully for my usecase.

    0 讨论(0)
  • 2021-01-01 01:10

    I came up with a solution, sharing in case anyone else is looking for the same thing:

    public class JsonParser {
    
        private List<String> pathList;
        private String json;
    
        public JsonParser(String json) {
            this.json = json;
            this.pathList = new ArrayList<String>();
            setJsonPaths(json);
        }
    
        public List<String> getPathList() {
            return this.pathList;
        }
    
        private void setJsonPaths(String json) {
            this.pathList = new ArrayList<String>();
            JSONObject object = new JSONObject(json);
            String jsonPath = "$";
            if(json != JSONObject.NULL) {
                readObject(object, jsonPath);
            }   
        }
    
        private void readObject(JSONObject object, String jsonPath) {
            Iterator<String> keysItr = object.keys();
            String parentPath = jsonPath;
            while(keysItr.hasNext()) {
                String key = keysItr.next();
                Object value = object.get(key);
                jsonPath = parentPath + "." + key;
    
                if(value instanceof JSONArray) {            
                    readArray((JSONArray) value, jsonPath);
                }
                else if(value instanceof JSONObject) {
                    readObject((JSONObject) value, jsonPath);
                } else { // is a value
                    this.pathList.add(jsonPath);    
                }          
            }  
        }
    
        private void readArray(JSONArray array, String jsonPath) {      
            String parentPath = jsonPath;
            for(int i = 0; i < array.length(); i++) {
                Object value = array.get(i);        
                jsonPath = parentPath + "[" + i + "]";
    
                if(value instanceof JSONArray) {
                    readArray((JSONArray) value, jsonPath);
                } else if(value instanceof JSONObject) {                
                    readObject((JSONObject) value, jsonPath);
                } else { // is a value
                    this.pathList.add(jsonPath);
                }       
            }
        }
    
    }
    
    0 讨论(0)
提交回复
热议问题