Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.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,我已经编写了一些代码来解析Android程序接收到的Google Distance Matrix JSON响应。我唯一感兴趣的数据是“距离”“值”节点 我的代码可以工作,但似乎必须有一种更简单的方法来做到这一点。距离值节点嵌套在JSON中相当深的位置,但是否真的需要遍历JSON的每一层才能到达所需的字段 以下是我的JSON响应: { "destination_addresses" : [ "5660 Baltimore National Pike, Ingleside Shopping Ce

我已经编写了一些代码来解析Android程序接收到的Google Distance Matrix JSON响应。我唯一感兴趣的数据是“距离”“值”节点


我的代码可以工作,但似乎必须有一种更简单的方法来做到这一点。距离值节点嵌套在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"
}

谢谢

除非您想编写自定义正则表达式来搜索json字符串,否则这将是访问它的最佳方式(也是最简单的方式)。是否有理由认为您需要“更高效地”访问它?

如果您愿意加入第三方库,您可以签出。

我建议您使用GSON(http://code.google.com/p/google-gson/)将JSON文本解析为java类实例,并且可以将类实例转换为JSON文本,Jackson是另一个很好的第三方解析器。看起来这里有一个比较


下面是一个使用树进行遍历的示例,不确定它是否比您已经在做的事情更容易,

我知道您现在的感受,我在android上遇到了/有着相同的JSON解析问题,我们没有嵌入到iOS上的@getValueforKey类功能,即使是显而易见的google现在也应该意识到这一点,但在Gson库上已经做了很多工作,可以通过谷歌Gson轻松解析json


这是一个很好的例子:

“但是真的需要遍历JSON的每一层才能到达您想要的字段吗?”是的-除非JSON没有太大变化,否则您可以通过一些字符串操作(jsonResponse.firstIndexOf(“\”distance\”)等)来获取数据。但使用当前使用的方法更安全。不需要更高效地访问感兴趣的节点,看起来应该更容易。但是我想获得我想要的字段的“内置”方法确实需要几个步骤。那么你应该真正坚持你目前的方法。它更具可读性和可靠性。很可能比将其转换为实际的java对象快得多。最后,我使用了我编写的代码,该代码贯穿JSON中的每个节点。我仍然坚持认为它比应该的更难解析!出于多种原因(转义等),Regexp是个坏主意,甚至不一定比适当的JSON库更有效。至于缓解,杰克逊和格森确实提供了更方便、更高效的方法。我将把这作为一种选择。从您提供的链接来看,这似乎是我所设想的更简单的JSON导航类型。谢谢乍一看,这似乎比上面推荐的json路径要复杂一些。但我会更仔细地阅读文档,看看是否能弄明白。谢谢有趣。有很多选择。我还得仔细阅读一下。谢谢不仅仅是树模型,它还可以使用JSON指针表达式(请参见
JsonNode.at(jsonPointerExpression)
。因此,类似于:
JsonNode root=mapper.readTree(…);int value=root.at(“/rows/1/elements/1/distance/value”)。asIntValue();
告诉我,即使是他们示例中的JSON也是无效的:
    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;
}