如何使用Gson或org.json库获取java中json的所有键?

时间:2015-12-10 11:57:57

标签: java json

例如,从以下json,id,items,fromNumber应该被检索。 json可以有n个嵌套。

{
"items": [{
    "id": 633706061003,
    "fromNumber": "16572307534",

    "contact": {
        "id": 499354453003,
        "homePhone": "16572307534"
    },

    "records": [{
        "id": 353389055003,
        "result": "LA",
        "recordings": [{
            "id": 16427622003,
        }]
    }]
}],
"limit": 100,
"offset": 0,
"totalCount": 5949

}

我已经实现了以下代码,但是在这段代码中我必须告诉嵌套级别

String prefix = "";

    /*
     * Root Array
     */
    JsonArray rootArray = new JsonParser().parse(json).getAsJsonArray();

    for (int i = 0; i < rootArray.size(); i++) {

        /*
         * Single object in root array while iterations. for id, properties, tags etc.
         */
        JsonObject rootArrayObject = rootArray.get(i).getAsJsonObject();

        Set<Map.Entry<String, JsonElement>> rootArrayObjectEntrySet = rootArrayObject.entrySet();

        /*
         * Getting the keys and values of RootArray Single Object
         */
        for (Map.Entry<String, JsonElement> entryChild : rootArrayObjectEntrySet) {

            prefix = entryChild.getKey();

            /*
             * Getting each object, key or array as an element
             */
            JsonElement rootArrayObjElement = rootArrayObject.get(entryChild.getKey());


            if(rootArrayObjElement.isJsonArray()){

                /*
                 * Getting array's object in single object of root array. Example: tags
                 */
                JsonArray rootArrayObjArray = rootArrayObjElement.getAsJsonArray();

                for (int j = 0; j < rootArrayObjArray.size(); j++) {


                }


            }else if(rootArrayObjElement.isJsonObject()){

                /*
                 * Single object in root array 
                 */
                JsonObject rootArrayObjObj = rootArrayObjElement.getAsJsonObject();

                Set<Map.Entry<String, JsonElement>> rootArrayObjObjEntrySet = rootArrayObjObj.entrySet();

                for (Map.Entry<String, JsonElement> rootArrayObjObjChild : rootArrayObjObjEntrySet) {




                    /*
                     * Getting each object, key or array as an element
                     */
                    JsonElement rootArrayObjObjElement = rootArrayObjObj.get(rootArrayObjObjChild.getKey());

                    if(rootArrayObjObjElement.isJsonPrimitive()){




                    }else if(rootArrayObjObjElement.isJsonArray()){

                        JsonArray rootArrayObjArray = rootArrayObjObjElement.getAsJsonArray();

                        for (int j = 0; j < rootArrayObjArray.size(); j++) {



                        }
                    }

                }


            }else if(rootArrayObjElement.isJsonPrimitive()){




            }


        }





    }

2 个答案:

答案 0 :(得分:2)

您可以尝试以下内容:

import com.google.gson.Gson;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;


public class GSonWay {

    public static void main(String[] args) throws Exception {
        String jsonString = "{\n"
                + "\"items\": [{\n"
                + "    \"id\": 633706061003,\n"
                + "    \"fromNumber\": \"16572307534\",\n"
                + "\n"
                + "    \"contact\": {\n"
                + "        \"id\": 499354453003,\n"
                + "        \"homePhone\": \"16572307534\"\n"
                + "    },\n"
                + "\n"
                + "    \"records\": [{\n"
                + "        \"id\": 353389055003,\n"
                + "        \"result\": \"LA\",\n"
                + "        \"recordings\": [{\n"
                + "            \"id\": 16427622003\n"
                + "        }]\n"
                + "    }]\n"
                + "}],\n"
                + "\"limit\": 100,\n"
                + "\"offset\": 0,\n"
                + "\"totalCount\": 5949\n"
                + "\n"
                + "}";
        List keys1 = getKeysFromJson(jsonString);
        System.out.println(keys1.size());
        System.out.println(keys1);

    }

    static List getKeysFromJson(String jsoString) throws Exception {
        Object things = new Gson().fromJson(jsoString, Object.class);
        List keys = new ArrayList();
        collectAllTheKeys(keys, things);
        return keys;
    }

    static void collectAllTheKeys(List keys, Object o) {
        Collection values = null;
        if (o instanceof Map) {
            Map map = (Map) o;
            keys.addAll(map.keySet()); // collect keys at current level in hierarchy
            values = map.values();
        } else if (o instanceof Collection) {
            values = (Collection) o;
        } else{return;}

        for (Object value : values) {
            collectAllTheKeys(keys, value);
        }
    }
}

输出:

[items, limit, offset, totalCount, id, fromNumber, contact, records, id, homePhone, id, result, recordings, id]

答案 1 :(得分:2)

Gson是解码JSON文件的最佳方法之一。 Gson需要POJO classe ,这可以手动生成但很烦人。开发POJO课程的最佳方法是访问 jsonschema2pojo.org 。他们将为您生成所需的POJO课程。

假设该类是 JsonData.java

因此,在您的代码中,您必须创建一个 Gson对象以及一个JSONData类的对象。

String jsonFile = "____let this be your json data___"

Gson gson = new Gson();
JsonData jsonData = new JsonData();
jsonData = gson.fromJson(jsonFile, JsonData.class);

现在jsonData将从json文件中检索所有数据。如果你想得到fromNumber,你可以调用 getFromNumber(),这将是JsonData类中的一个方法。同样,您也可以调用其他值。

尝试使用jsonschema2pojo.org等第三方服务来提高工作效率。