如何访问JSON值

时间:2018-03-27 20:10:33

标签: java json

不确定如何访问此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”值在底部):

https://maps.googleapis.com/maps/api/directions/json?origin=Bournemouth+University&destination=London+England&key=AIzaSyBn2qYJcHoNCgNQZv1mcycnUo06sJDZPBs

到目前为止,这是我的代码,它会生成此错误:

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();
                }
    }

我确信这是一个非常简单的问题,我知道有人会将此标记为重复的问题,但我只是希望得到一些帮助。

3 个答案:

答案 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");
}