我正在尝试解析一些JSON格式的文本,但我不太确定如何处理动态对象名称。我一直在网上寻找,从我所知道的这被称为java中的字典或MAP,但是我无法弄清楚如何处理动态长度。
我使用http://jsonlint.com/验证了我的JSON,我正在解析的代码如下。
{
"0": {
"animal_name": "Yoshi",
"animal_type": "Day Gecko",
"animal_id": "1"
},
"1": {
"animal_name": "Wigglesworth",
"animal_type": "Bearded Dragon",
"animal_id": "2"
},
"command": "login",
"owner_id": "1"
}
开始时有一些细节是静态的,然后返回动物,动物的数量是动态的。
我可以提取第一部分(Command和Owner_ID),我可以单独提取动物,但我不知道如何循环动物阵列。我不知道有多少动物,如果我试图动态地引用它们,它就会编译。
这是我用来从物体中抓取动物的代码,我只是在努力让它变得动态。 android json response key value, parsing
这与我在IOS上发布的另一个问题非常相似,所以我的解决方案有点发达,但仍然不太完善。 Parse nested JSON code in IOS
//parse the JSON header
JSONObject jo = new JSONObject(result);
//extract the owner id from the login response
owner_id=jo.getInt("owner_id");
//if the server throws an error, pass this back
if (!jo.isNull("error"))
{
//store to global variable
server_response=jo.getString("error");
}
else
{ //we only look for animals if a valid owner has logged in
if (owner_id>0)
{ //loop through the sub items.
//HELP PLEASE: THE x<=5 needs to change to loop to the number of dictionary items in the JSONObject JO
for(int x=0; x<=5; x++){
//Extract each animal
//HELP PLEASE: The jo.getJSONObject needs to get a dynamic item, but if I put x in here, it doesnt compile
JSONObject animal = jo.getJSONObject("1");
String animal_name = new String();
String animal_type = new String();
int animal_id = 0;
//try and extract pets
animal_name=animal.getString("animal_name");
animal_type=animal.getString("animal_type");
animal_id=animal.getInt("animal_id");
//To Do: This code will overwrite each animal with the last. Need so store in an array.
//get shared preferences object
SharedPreferences prefs = a03_home_page.this.getSharedPreferences("my_app_name", Context.MODE_PRIVATE);
//store the data
prefs.edit().putString("animal_name", animal_name).commit();
prefs.edit().putString("animal_type", animal_type).commit();
prefs.edit().putInt("animal_id", animal_id).commit();
}
}
}
答案 0 :(得分:0)
通常,我建议更改JSON以使用数组。
{
"animals": [
{
"animal_name": "Yoshi",
"animal_type": "Day Gecko",
"animal_id": "1"
},
{
"animal_name": "Wigglesworth",
"animal_type": "Bearded Dragon",
"animal_id": "2"
}, {... more animals ...}
],
"command": "login",
"owner_id": "1"
}
现在,您可以简单地将动态数量的动物添加到JSONArray
&#34;动物&#34;并使用for-loop
和jsonArray.getJSONObject(i);
但是,如果您无法将json更改为您的目的,则可以迭代键:
Iterator keys = json.keys();
while(keys.hasNext()){
JSONObject animal = json.getJSONObject(keys.next());
// do smth
}
这种方法的问题是,你必须小心使用&#34;命令&#34;和&#34; owner_id&#34;,因为那不是json对象。所以你需要在while循环中使用更多的逻辑。
答案 1 :(得分:0)
您需要使用:
Gson gson = new Gson();
Object o = gson.fromJson(str, Object.class);
List keys = new ArrayList();
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;
}
System.out.println(keys);// [CDG, ORY, LBG]
for (int i = 0; i < keys.size(); i++) {
System.out.println(keys.get(i));
}
如此link
所示答案 2 :(得分:0)
String result=yourjsondata.toString();
首先像这样分配你的json数组
JSONArray jsar=new JSONArray(result);
然后解析像这样的对象
for(int i=0;i<jsar.length;i++)
{
JSONObject jsobj=new JSONObject(jsar[i]);
String strcode=jsobj.get("code");
String strrate=jsobj.get("rate");
String strtitle=jsobj.get("title");
String strsubtitle=jsobj.get("subtitle");
}