将JSON.Simple与嵌套对象和数组一起使用

时间:2014-07-19 15:08:44

标签: java json

我已经决定使用JSON.Simple来解析我的应用程序中的Java,就像GSON或Jackson一样,因为它们对我的需求似乎过于复杂,并且似乎需要额外的类文件才能按预期工作。我有以下JSON:

{
    "request":{
        "act":"rec_load_all",
        "email":"Redacted",
        "tkn":"Redacted",
        "a":"rec_load_all",
        "z":"Redacted"
    },
    "response":{
        "recs":{
            "has_more":false,
            "count":9,
            "objs":[{
                "rec_id":"1385442465",
                "rec_hash":"1825780e334bcd831034bd9ca62",
                "zone_name":"Redacted",
                "name":"Redacted",
                "display_name":"Redacted",
                "type":"A",
                "prio":null,
                "content":"Redacted",
                "display_content":"Redacted",
                "ttl":"1",
                "ttl_ceil":86400,
                "ssl_id":null,
                "ssl_status":null,
                "ssl_expires_on":null,
                "auto_ttl":1,
                "service_mode":"1",
                "props":{
                    "proxiable":1,
                    "cloud_on":1,
                    "cf_open":0,
                    "ssl":0,
                    "expired_ssl":0,
                    "expiring_ssl":0,
                    "pending_ssl":0,
                    "vanity_lock":0
                }
            }]
        }
    },
    "result":"success",
    "msg":null
}

objs数组列出了9个不同的项目,但为了简单起见我只包含了一个。我需要在has_more内获得countidobjs。我试过了:

JSONParser jsonParser = new JSONParser();
JSONObject jsonObject = (JSONObject) jsonParser.parse(responseString);
JSONArray objs = (JSONArray) jsonObject.get("objs");
Iterator<JSONObject> iterator = objs.iterator();
while (iterator.hasNext()) {
    JSONObject idObj = (JSONObject) iterator.next();
    String id = (String) idObj.get("rec_id");
    System.out.println(id);
}

但是它会触发java.lang.NullPointerException错误,所以我假设因为它嵌套在response -> recs -> objs下它没有获得值。我也关注了几年的教程,所以有些东西可能会改变。如果你能解释什么是错误的以及如何解决它的一个例子,我会非常感激,我通过观察来学习。

编辑:完整错误

Exception in thread "main" java.lang.NullPointerException
    at ddns.Net.getId(Net.java:46)
    at ddns.DDNS.main(DDNS.java:7)
Java Result: 1

ddns.Net.getId(Net.java:46)| Iterator<JSONObject> iterator = objs.iterator(); ddns.DDNS.main(DDNS.java:7)| Just calls the method

2 个答案:

答案 0 :(得分:5)

你必须从父母那里拿走任何json对象,看看这段代码(我试过并且有效):

    public static void main(String[] args) throws IOException, ParseException {

    JSONParser jsonParser = new JSONParser();

    InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("json.json");
    InputStreamReader reader = new InputStreamReader(is);
    JSONObject result = (JSONObject) jsonParser.parse(reader);
    JSONObject response = (JSONObject) result.get("response");
    JSONObject recs = (JSONObject) response.get("recs");

    boolean hasMore = (Boolean) recs.get("has_more");
    JSONArray objs = (JSONArray) recs.get("objs");
    System.out.println(recs);
    System.out.println("has more " + hasMore);

    Iterator objIter = objs.iterator();
    int i = 0;
    while (objIter.hasNext()) {
        i++;
        System.out.println(String.format("obj %d: %s", i, objIter.next()));
    }

}

还有另一种方法对我来说更容易,就是创建一个具有相同结构的Java Bean,所以...你将解析一个空洞对象,如果你对这种方法感兴趣请告诉我。

答案 1 :(得分:0)

@Carlos Verdes向我指出了正确的方向。

我想从较大的JSON中输入联盟的名称My_League,因为每个用户的联盟名称都不同。

为简洁起见,JSON代码段已缩短:

{..."name":"Some_Dude", ... ,"expLevel":221,"league":{"id":12345,"name":"My_League","iconUrls":...},...}

JSON中存在多次出现的密钥"name",并且如果您再次寻找密钥"name",则JSON。Simple只是检索到"name"的第一个匹配项,即{{1} }就在开头。

为了解决这个问题,我将JSON的该部分(密钥"Some_Dude"设置为JSON对象,然后从该对象中提取了密钥"league"以获取我的字符串"name"

"My_League"

关键在于,提取JSONObject leagueObj = (JSONObject) each.get("league"); String league = (String)leagueObj.get("name"); 后,您将得到"league":之后的所有内容,包括:到结束处的下一个{..}之间的所有内容卷曲的,。就我而言,这远远超出了您只需要解析该较小部分(即JSON对象)的余地。