使用Android解析JSON的最有效方法

7
我已经编写了一些代码来解析我在Android程序中收到的Google Distance Matrix JSON响应。我感兴趣的唯一数据位于“distance”“value”节点中。
我的代码可以工作,但似乎有更简单的方法来实现这一点。距离值节点嵌套在JSON中的深层结构中,但是必须通过JSON的每一层才能获得所需字段吗?
以下是我的JSON响应:
{
"destination_addresses" : [
  "5660 Baltimore National Pike, Ingleside Shopping Center, Catonsville, MD 21228, USA"
],
"origin_addresses" : [ "Hilltop Cir, Baltimore, MD 21250, USA" ],
"rows" : [
  {
     "elements" : [
        {
           "distance" : {
              "text" : "3.1 mi",
              "value" : 4922 <--THE FIELD I WANT TO EXTRACT
           },
           "duration" : {
              "text" : "11 mins",
              "value" : 666
           },
           "status" : "OK"
        }
     ]
  }
],
"status" : "OK"
}

以下是我用来提取距离值的代码:

    private double extractDistance(JSONObject json) {
    JSONArray rowsArray = null;
    double distanceInMiles = -1;
    try {
        // Getting Array of Distance Matrix Results
        rowsArray = json.getJSONArray("rows");
        JSONObject rowsObject = rowsArray.getJSONObject(0);//only one element in this array
        JSONArray elementsArray = rowsObject.getJSONArray("elements");
        JSONObject elementsObject = elementsArray.getJSONObject(0);//only one element in this array
        JSONObject distanceObject = elementsObject.getJSONObject("distance");
        distanceInMiles = (distanceObject.getDouble("value"))/1609.344; //distance in meters converted to miles
    }
    catch (JSONException e) {
        e.printStackTrace();
    }
    return distanceInMiles;
}

谢谢!


2
“但是真的有必要遍历JSON的每一层才能获取到你想要的字段吗?” 是的 - 除非JSON不会经常变化,那么你可以通过一些字符串操作(例如jsonResponse.firstIndexOf(""distance"")等)来获取数据。但是最安全的方法还是保持你目前使用的方法。 - zapl
5个回答

6
我建议您使用GSON (http://code.google.com/p/google-gson/),它可以将JSON文本解析为Java类实例,并能够将类实例转换为JSON文本。

乍一看,这似乎比上面推荐的json-path要复杂一些。但我会更仔细地阅读文档,看看能否弄清楚。谢谢! - pjd

6

有趣。有很多选择。我也得好好研究一下这个。谢谢! - pjd
不仅可以使用树模型,还可以使用JSON指针表达式(参见JsonNode.at(jsonPointerExpression))。因此,可以像这样使用:JsonNode root = mapper.readTree(...); int value = root.at("/rows/1/elements/1/distance/value").asIntValue(); - StaxMan

3

除非你想编写自定义正则表达式来搜索json字符串,否则这将是访问它的最佳方式(也是最简单的方式)。你是否有什么原因感觉需要“更有效地”访问它?


没有真正的“必要”更高效地访问感兴趣的节点,只是似乎应该更容易。但我猜想获取我想要的字段的“内置”方式确实需要几个步骤。 - pjd
那么你应该坚持你当前的方法。它更易读、可靠,而且很可能比将其转换为实际的Java对象要快得多。 - cDecker32
最终,我最终使用了我编写的代码,它会通过JSON中的每个节点。我仍然认为解析比应该更困难! - pjd
正则表达式不是一个好的选择,因为它存在多种问题(如转义等),而且甚至不一定比正确的JSON库更高效。就便捷性而言,Jackson和GSON提供了更加方便和高效的方式。 - StaxMan

3

我会把这作为一个选项来考虑。从你给的链接中,那似乎是我所设想的更简单的JSON导航类型。谢谢! - pjd

2
我知道你现在的感受,我在Android上也遇到了/有同样的JSON解析问题,因为我们没有像iOS嵌入的@getValueforKey这样的功能。即使这是如此明显,Google现在应该意识到它了。但是Gson库已经做了很好的工作,寻找Google Gson 这里可以轻松解析JSON。

这是一个不错的教程:Gson教程


告诉我吧,即使是他们示例中的JSON也不是有效的:http://developer.android.com/reference/android/util/JsonReader.html - prasanthv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接