【问题标题】:JSON Parser Skipping Nodes?JSON解析器跳过节点?
【发布时间】:2012-09-06 23:07:54
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: android json parsing google-maps


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 我更改了代码。 5 循环只是我应该在代码循环中使用 5 的一个例子。对不起。
    • 你应该使用contacts.lenght之类的,避免硬编码
    • 我将使用 .length() 我只是希望它只循环 5 个用于测试目的。不幸的是,我还没有弄清楚是什么导致了这个问题。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-14
      • 2018-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多