我已经决定使用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
内获得count
,id
和objs
。我试过了:
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
答案 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对象)的余地。