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