有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    如果先写出JSON结构,就更容易了

    如果试图访问overview_polyline中的points

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

    如果您试图访问steps中的points

    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");
    }
    
  2. # 2 楼答案

    关于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()
    
  3. # 3 楼答案

    1-构建此对象的类

    2-去检查一下这可能对你有帮助Gson