1

我用这个做了一个简单的 JSON 解析器。我想要做的就是使用 Google 地图 api 解析企业的名称和纬度/经度,但我似乎无法正确解析它。

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 输出:Result#1 //这很好
  • Loop 2 Output: Results#5 //不知何故我们跳到结果#5而不是得到#2
  • 循环 3 输出:Results#5 //现在它只是在循环的其余部分每次都保持打印 #5
  • 循环 4 输出:结果#5
  • 循环 5 输出:结果#5

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

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

我在 Java 方面真的不是那么好,这是我第一次使用 JSON,所以请不要说我可能说过的任何愚蠢。任何帮助深表感谢。:)

4

2 回答 2

0

嗨,我无法理解您的五个循环,因为正如您所说,它应该只有三个循环。有一次当我使用 JSON 文件时,我遇到了类似的问题。我建议你打印你拥有的真实数量的对象

JSONArray contacts = json.getJSONArray("results");

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

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

contacts.getJSONObject(i).getJSONObject("geometry").getJSONObject("location").getString("lat")
于 2012-09-07T00:19:06.030 回答
0

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

于 2012-09-14T22:14:37.437 回答