Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/181.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 解析JSON数组中对象的动态数量_Android_Json - Fatal编程技术网

Android 解析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",

我试图解析一些JSON格式的文本,但我不太确定如何处理动态对象名。我一直在网络上四处寻找,从我所知道的,这在java中被称为字典或地图,但是我不太明白如何处理动态长度

我已经使用验证了我的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),也可以单独提取动物,但我不确定如何循环遍历动物数组。我不知道有多少动物,如果我尝试动态引用它们,它不会编译

这是我用来从对象抓取动物的代码,我只是在努力使其动态化。

这与我在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版本代码无效。