我从服务器返回JSON响应,我需要抓取的数组是嵌入在多个对象和数组中的值。我需要抓住 formatIds JSONArray。我的JSON看起来像这样:
{
"entries": [
{
"title": "sample",
"targets": [
{
"format": "wav",`enter code here`
"description": "A wav file",
"formatCriteria": [
{
"formatSelectionTitle": "Find WAV files",
"formatSteps": {
"UniqueId": "214212312321",
"formatMatches": {
"formatIds": [
"WAV",
"MP3"
]
}
}
}
]
}
]
}
]
}
我能够弄清楚的唯一方法就是拥有一堆嵌入式for循环:
String[] assetUri;
for (int i = 0; i < entriesArray.length(); i++) {
entryJsonOjbect = entriesArray.getJSONObject(i);
fileTargetArray = tempObj.getJSONArray("targets");
//Loop through the targets array
for (int j = 0; j < fileTargetArray.length(); j++) {
tempObj = fileTargetArray.getJSONObject(j);
fileCriteriaArray = tempObj.getJSONArray("formatCriteria");
//Loop through fileCriteria Array
for (int h = 0; h < fileCriteriaArray.length(); h++) {
JSONObject fileCriteriaObj = fileCriteriaArray.getJSONObject(h);
//Get the JSON Object 'formatSteps'
JSONObject selectStepObj = fileCriteriaObj.getJSONObject("formatSteps");
//Get the JSON Object 'formatMatches'
JSONObject selectionMatches = selectStepObj.getJSONObject("formatMatches");
//FINALLY. Get the formatIds ARray
JSONArray assetTypeArray = selectionMatches.getJSONArray("formatIds");
//Assign the values from the JSONArray to my class
assetUri = new String[assetTypeArray.length()];
for (int z = 0; z < assetTypeArray.length(); z++) {
assetUri[z] = assetTypeArray.getString(z);
}
}
}
}
由于所有嵌入式循环,此代码真的非常慢x20。有没有办法让我得到这个JSONArray而不必拥有这个额外的代码?在jQuery中有一个 JSON.find ,并想知道在Java中是否有类似的东西?我已经在根jsonObject上尝试了JSON API调用 getJSONArray 和 get ,但除非您在json数组所在的对象中,否则它不起作用。我确信我可以做某种类型的递归解决方案,但这仍然很烦人。有什么建议??
答案 0 :(得分:1)
使用org.json
库解析JSON就像使用DOM解析XML:一步一步。但是:你需要所有这些循环。
如果你的JSON响应总是看起来像你发布的那个(每个数组中的一个元素),那么你的JSON效率非常低。如果您只想要“第一个”条目,请不要遍历数组。
使用org.json
解析这样一个复杂的数据结构可能会很痛苦。您是否尝试过(更自动化)google-gson库?查看the examples。虽然我不想说用gson解析它会在CPU时间方面更快,但在开发时间方面它会更快。
我最近刚刚写了一篇关于这个主题的博文:JSON and Java
答案 1 :(得分:0)
您可以使用诸如GSON之类的库来为您解析Java对象,而不是手动超越和循环。
http://java.sg/parsing-a-json-string-into-an-object-with-gson-easily/