Android 解析JSON数组中对象的动态数量
我试图解析一些JSON格式的文本,但我不太确定如何处理动态对象名。我一直在网络上四处寻找,从我所知道的,这在java中被称为字典或地图,但是我不太明白如何处理动态长度 我已经使用验证了我的JSON,下面是我正在解析的代码Android 解析JSON数组中对象的动态数量,android,json,Android,Json,我试图解析一些JSON格式的文本,但我不太确定如何处理动态对象名。我一直在网络上四处寻找,从我所知道的,这在java中被称为字典或地图,但是我不太明白如何处理动态长度 我已经使用验证了我的JSON,下面是我正在解析的代码 { "0": { "animal_name": "Yoshi", "animal_type": "Day Gecko", "animal_id": "1" }, "1": { "animal_name": "Wigglesworth",
{
"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),也可以单独提取动物,但我不确定如何循环遍历动物数组。我不知道有多少动物,如果我尝试动态引用它们,它不会编译
这是我用来从对象抓取动物的代码,我只是在努力使其动态化。
这与我在IOS中发布的另一个问题非常相似,因此我的解决方案稍微成熟了一些,但仍然不太完善。
//解析JSON头
JSONObject jo=新的JSONObject(结果);
//从登录响应中提取所有者id
所有者id=jo.getInt(“所有者id”);
//如果服务器抛出错误,请将其传回
如果(!jo.isNull(“错误”))
{
//存储到全局变量
server_response=jo.getString(“错误”);
}
其他的
{//我们只在有效所有者登录的情况下查找动物
如果(所有者id>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
“动物”中,并使用for循环和JSONArray.getJSONObject(i);
但是,如果无法根据自己的目的更改json,则可以迭代键:
Iterator keys = json.keys();
while(keys.hasNext()){
JSONObject animal = json.getJSONObject(keys.next());
// do smth
}
这种方法的问题是,您必须小心使用“command”和“owner\u id”,因为它们不是json对象。因此,您需要在while循环中使用更多的逻辑。您需要使用:
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));
}
Gson-Gson=new-Gson();
objecto=gson.fromJson(str,Object.class);
列表键=新的ArrayList();
集合值=null;
if(o映射的实例){
Map=(Map)o;
keys.addAll(map.keySet());//收集层次结构中当前级别的键
values=map.values();
}else if(o集合实例){
值=(集合)o;
}
System.out.println(键);//[CDG、ORY、LBG]
对于(int i=0;i
如图所示
首先像这样分配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");
}
然后像这样解析对象
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");
}
for(int i=0;iHi.对键进行迭代就像是一种享受。我在下面发布了代码,以帮助其他人阅读此线程。`animal_count=0;int ServerObjectCount=0;Iterator KeyLoop=jo.keys();while(KeyLoop.hasNext()){KeyLoop.next();ServerObjectCount++}//减去已知不是动物的两项ServerObjectCount=ServerObjectCount-2;@NickHardman听到这个消息很高兴。那么,请随意接受这个答案。感谢您的帮助。根据您的建议更改JSON不是一个选项,因为这样会使iOS版本代码无效。