JSON分析器跳过节点?

时间:2012-09-06 23:07:55

标签: android json parsing google-maps

我使用this创建了一个简单的JSON解析器。我想要做的就是使用Google maps api解析名称和lat / lng的业务,但我似乎无法正确解析它。

JSON结果示例:

"results" : [
  {
     "geometry" : {
        "location" : {
           "lat" : 41.8881090,
           "lng" : -87.6308430
        }
     },
     "name" : "American Bar Association",
  },
  {
     "geometry" : {
        "location" : {
           "lat" : 41.8721230,
           "lng" : -87.6294680
        }
     },
     "name" : "Bar Louie",

  } ], "status" : "OK"}

我拿出了一些其他细节我不想缩短这个例子,但这是我的代码:

            JSONParser jParse = new JSONParser();
            JSONObject json = jParse.getJSON(url);

            try
            {   
                JSONArray contacts = json.getJSONArray("results"); //Parent Node
                for(int i = 0; i < 5; i++)//Loop through first 5 results results            
                {
                    JSONObject c = contacts.getJSONObject(i);
                    name = c.getString("name");//Gets name field 

                    //get lat from location which is a sub object of geometry                       
                    lat = Float.valueOf (contacts.getJSONObject(i).getJSONObject("geometry").getJSONObject("location").getString("lat")); 
                }
            } catch (JSONException e) { e.printStackTrace(); }

当我运行它时,我得到第一个结果就好了,我得到正确的名称和纬度但不是移动到第二个结果,它移动到i的最后结果并打印它用于循环的其余部分。很难解释,我的意思是如果我循环完成5个结果我得到:

  • 循环1输出:结果#1 //这很好
  • 循环2输出:结果#5 //不知何故,我们跳到结果#5而不是#2
  • 循环3输出:结果#5 //现在它只是在循环的其余部分继续打印#5
  • 循环4输出:结果#5
  • 循环5输出:结果#5

我不知道它是如何忽略for循环并获得最后的结果?我只用一个Toast消息打印结果,我留下了一个较短的片段。

(我会注意到我通过一个单独的线程运行它并使用处理程序显示Toast消息,如果这很重要的话)

我在Java中真的不是那么棒,而且这是我第一次使用JSON,所以我可以说任何愚蠢。任何帮助深表感谢。 :)

2 个答案:

答案 0 :(得分:0)

嗨我无法理解你的五个循环,因为你说它应该只有三个循环。一旦我使用JSON文件,我遇到了类似的问题。我建议你打印

之后的实际对象数量
JSONArray contacts = json.getJSONArray("results");

我的问题是我认为我在数组中有我想要的元素(联系人 - 用3个对象填充)但实际上我有一些不同的东西(例如几何对象)

在我使用JSON的语言中,结果是字典,所以也许你不应该连接getJSONObject

contacts.getJSONObject(i).getJSONObject("geometry").getJSONObject("location").getString("lat")

答案 1 :(得分:0)

我最终回答了自己的问题。我认为这是因为我每次通过循环重新使用name变量,并且在处理程序启动和完成时显示第一条消息,循环已经完成并为最后一个值分配名称。因此,当其他4个处理程序请求最终执行时,它只打印了相同的值4次。