不确定如何访问此JSON中的“points”值。我是初学者并且已经阅读了教程,但我仍然不明白如何获得这个值,因为它不是像[]那样的自己的数组,而是使用{}。
修改
我设法解决了这个问题,我的for循环中的这一行需要转换为String:
polyline = (String) objPoints.get("points");
修改
我尝试了另一种方法,但是我无法获得我想要的数据。我的代码不会产生输出,我的System.out.println
不会显示在控制台中。
public void getDirections() {
try {
String polyline = "";
URL url = new URL("https://maps.googleapis.com/maps/api/directions/json?origin=Bournemouth+University&destination=" + houseNumber + "+" + address + "+" + city + "&key=AIzaSyBn2qYJcHoNCgNQZv1mcycnUo06sJDZPBs");
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setRequestMethod("GET");
conn.connect();
int responseCode = conn.getResponseCode();
if (responseCode != 200) {
throw new RuntimeException("HttpResponseCode: " + responseCode);
} else {
Scanner scan = new Scanner(url.openStream());
StringBuilder jsonIn = new StringBuilder();
while (scan.hasNextLine()) {
jsonIn.append(scan.nextLine());
}
scan.close();
System.out.println(jsonIn.toString());
JSONParser parser = new JSONParser();
JSONObject objRoot = (JSONObject) parser.parse(jsonIn.toString());
JSONArray routesArray = (JSONArray) objRoot.get("routes");
for (int i = 0; i < routesArray.size(); i ++) {
JSONObject objOverviewPolyline = (JSONObject) routesArray.get(i);
JSONObject objPoints = (JSONObject) objOverviewPolyline.get("overview_polyline");
polyline = objPoints.get("points").toString();
}
System.out.println("POLYLINE " + polyline);
}
}catch (Exception e) {
e.printStackTrace();
}
JSON(“points”值在底部):
到目前为止,这是我的代码,它会生成此错误:
Unexpected token RIGHT BRACE(}) at position 0.
at org.json.simple.parser.JSONParser.parse(JSONParser.java:257)
at org.json.simple.parser.JSONParser.parse(JSONParser.java:81)
at org.json.simple.parser.JSONParser.parse(JSONParser.java:75)
at CustomerMap.getDirections(CustomerMap.java:73)
at CustomerMap.<init>(CustomerMap.java:39)
CustomerMap类代码:
JSONParser parser = new JSONParser();
JSONObject jObj = (JSONObject)parser.parse(result);
JSONArray jsonArray = (JSONArray)jObj.get("routes");
for (int i = 0; i < jsonArray.size(); i ++) {
JSONObject jObjPolyline = (JSONObject)jsonArray.get(i);
JSONObject jObjPoints = (JSONObject)jObjPolyline.get("overview_polyline");
JSONArray jsonPolylineArray = (JSONArray)jObjPolyline.get("points");
for (int j = 0; j < jsonPolylineArray.size(); j ++) {
polyline = jsonPolylineArray.get(j).toString();
}
}
我确信这是一个非常简单的问题,我知道有人会将此标记为重复的问题,但我只是希望得到一些帮助。
答案 0 :(得分:0)
好吧,关于points
的检索:最让我帮助的是首先在脑海中组装正确的JSON路径。有很多工具可以做到这一点,例如http://jsonpath.com/
所以你可以在这里找到你的points
对象:
routes[*].legs[*].steps[*].polyline.points
如果这还不足以增强您的实施,那么这是一个有效的例子:
import static org.assertj.core.api.Assertions.assertThat;
import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.apache.commons.io.FileUtils;
import org.junit.Test;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JsonParserTest {
@Test
public void points() throws Exception {
String jsonString = FileUtils.readFileToString(new File(JsonParserTest.class.getResource("/points.json").getFile()), "UTF-8");
List<String> points = new ArrayList<>();
ObjectMapper mapper = new ObjectMapper();
JsonNode actualObj = mapper.readTree(jsonString);
// routes[*].legs[*].steps[*].polyline.points
Iterator<JsonNode> routes = actualObj.get("routes").elements();
while (routes.hasNext()) {
Iterator<JsonNode> legs = routes.next().get("legs").elements();
while (legs.hasNext()) {
Iterator<JsonNode> steps = legs.next().get("steps").elements();
while (steps.hasNext()) {
points.add(steps.next().get("polyline").get("points").asText());
}
}
}
System.out.println(points);
assertThat(points.size()).isGreaterThan(0);
}
}
一种相当简单的方法,尤其显示了JSON的嵌套结构。 也许你应该考虑为完整的结构实现某个POJO ...然后解析就像这样简单:
import com.fasterxml.jackson.databind.ObjectMapper;
new ObjectMapper().readValue(jsonString, PojoRepresentingTheJson.class);
可以使用上面的points
对象直接联系文档底部的routes
:
routes.next().get("overview_polyline").get("points").asText()
答案 1 :(得分:0)
1-构建此对象的类
2-去检查这可能会对你有所帮助Gson
答案 2 :(得分:0)
如果先写出JSON结构,会更容易。
如果您尝试访问points
中的overview_polyline
值,
root.routes[i].overview_polyline.points
您可以使用以下代码执行此操作:
for (int i = 0; i < jsonArray.size(); i++) {
JSONObject route = jsonArray.get(i);
JSONObject jObjPolyline = route.get("overview_polyline");
JSONObject jObjPoint = jObjPolyline.get("points");
}
如果您尝试访问points
中的steps
值,
root.routes[i].legs[j].steps[k].polyline.points
你可以这样做:
for (int i = 0; i < jsonArray.size(); i++) {
JSONObject route = (JSONObject) jsonArray.get(i);
for (JSONObject leg: route.get("legs")) {
for (JSONObject step: leg.get("steps)) {
JSONObject points = step.get("polyline").get("points");
}