在 Java 内检索 Json 数据

Retrieve Json Data within Java

我想在这件事上寻求你的帮助。 我以前从未使用过 Json / Gson,这就是我想做的。

  1. 对于一个研究项目,我们想使用 HERE API,它提供了一个字符串,其中包含两个地址之间的路线时间。生成包含两个地址纬度和经度的 URL 已经很好用了。如果我点击 link 打开这个页面:

JSON 视图:

原始字符串:

{
  "response": {
    "metaInfo": {
      "timestamp": "2020-06-09T06:25:38Z",
      "mapVersion": "8.30.109.150",
      "moduleVersion": "7.2.202021-7166",
      "interfaceVersion": "2.6.76",
      "availableMapVersion": [
        "8.30.109.150"
      ]
    },
    "route": [
      {
        "waypoint": [
          {
            "linkId": "+1131186975",
            "mappedPosition": {
              "latitude": 51.3547214,
              "longitude": 6.1533969
            },
            "originalPosition": {
              "latitude": 51.3547199,
              "longitude": 6.1534
            },
            "type": "stopOver",
            "spot": 0.1907895,
            "sideOfStreet": "neither",
            "mappedRoadName": "Tegelseweg",
            "label": "Tegelseweg - N271",
            "shapeIndex": 0,
            "source": "user"
          },
          {
            "linkId": "+1151950438",
            "mappedPosition": {
              "latitude": 52.3654734,
              "longitude": 4.8532104
            },
            "originalPosition": {
              "latitude": 52.3654734,
              "longitude": 4.8532099
            },
            "type": "stopOver",
            "spot": 0.3333333,
            "sideOfStreet": "neither",
            "mappedRoadName": "Hoofdweg",
            "label": "Hoofdweg",
            "shapeIndex": 1367,
            "source": "user"
          }
        ],
        "mode": {
          "type": "fastest",
          "transportModes": [
            "truck"
          ],
          "trafficMode": "disabled",
          "feature": []
        },
        "leg": [
          {
            "start": {
              "linkId": "+1131186975",
              "mappedPosition": {
                "latitude": 51.3547214,
                "longitude": 6.1533969
              },
              "originalPosition": {
                "latitude": 51.3547199,
                "longitude": 6.1534
              },
              "type": "stopOver",
              "spot": 0.1907895,
              "sideOfStreet": "neither",
              "mappedRoadName": "Tegelseweg",
              "label": "Tegelseweg - N271",
              "shapeIndex": 0,
              "source": "user"
            },
            "end": {
              "linkId": "+1151950438",
              "mappedPosition": {
                "latitude": 52.3654734,
                "longitude": 4.8532104
              },
              "originalPosition": {
                "latitude": 52.3654734,
                "longitude": 4.8532099
              },
              "type": "stopOver",
              "spot": 0.3333333,
              "sideOfStreet": "neither",
              "mappedRoadName": "Hoofdweg",
              "label": "Hoofdweg",
              "shapeIndex": 1367,
              "source": "user"
            },
            "length": 183631,
            "travelTime": 8364,
            "maneuver": [
              {
                "position": {
                  "latitude": 51.3547214,
                  "longitude": 6.1533969
                },
                "instruction": "Head toward <span class=\"toward_street\">Hulsterweg</span> on <span class=\"street\">Tegelseweg</span> <span class=\"number\">(N271)</span>. <span class=\"distance-description\">Go for <span class=\"length\">123 m</span>.</span>",
                "travelTime": 16,
                "length": 123,
                "id": "M1",
                "_type": "PrivateTransportManeuverType"
              },
              {
                "position": {
                  "latitude": 51.3555801,
                  "longitude": 6.154511
                },
                "instruction": "Make a U-Turn onto <span class=\"next-street\">Tegelseweg</span> <span class=\"number\">(N271)</span>. <span class=\"distance-description\">Go for <span class=\"length\">274 m</span>.</span>",
                "travelTime": 126,
                "length": 274,
                "id": "M2",
                "_type": "PrivateTransportManeuverType"
              },
              {
                "position": {
                  "latitude": 51.3541317,
                  "longitude": 6.1523652
                },
                "instruction": "Turn <span class=\"direction\">right</span> and take ramp onto <span class=\"number\">A73</span> toward <span class=\"sign\"><span lang=\"nl\">Eindhoven</span>/<span lang=\"nl\">Nijmegen</span></span>. <span class=\"distance-description\">Go for <span class=\"length\">64.3 km</span>.</span>",
                "travelTime": 2746,
                "length": 64315,
                "id": "M3",
                "_type": "PrivateTransportManeuverType"
              },
              {
                "position": {
                  "latitude": 51.8447292,
                  "longitude": 5.7708693
                },
                "instruction": "Keep <span class=\"direction\">right</span> onto <span class=\"number\">A73</span>. <span class=\"distance-description\">Go for <span class=\"length\">3.8 km</span>.</span>",
                "travelTime": 166,
                "length": 3793,
                "id": "M4",
                "_type": "PrivateTransportManeuverType"
              },
              {
                "position": {
                  "latitude": 51.856252,
                  "longitude": 5.7191348
                },
                "instruction": "Take the exit toward <span class=\"sign\"><span lang=\"nl\">Rotterdam</span>/<span lang=\"nl\">Arnhem</span></span> onto <span class=\"number\">A50</span>. <span class=\"distance-description\">Go for <span class=\"length\">2.3 km</span>.</span>",
                "travelTime": 102,
                "length": 2338,
                "id": "M5",
                "_type": "PrivateTransportManeuverType"
              },
              {
                "position": {
                  "latitude": 51.8729675,
                  "longitude": 5.7295954
                },
                "instruction": "Keep <span class=\"direction\">left</span> onto <span class=\"number\">A50</span>. <span class=\"distance-description\">Go for <span class=\"length\">2.5 km</span>.</span>",
                "travelTime": 103,
                "length": 2471,
                "id": "M6",
                "_type": "PrivateTransportManeuverType"
              },
              {
                "position": {
                  "latitude": 51.893481,
                  "longitude": 5.7424915
                },
                "instruction": "Keep <span class=\"direction\">left</span> onto <span class=\"number\">A50</span>. <span class=\"distance-description\">Go for <span class=\"length\">1.4 km</span>.</span>",
                "travelTime": 61,
                "length": 1440,
                "id": "M7",
                "_type": "PrivateTransportManeuverType"
              },
              {
                "position": {
                  "latitude": 51.9014311,
                  "longitude": 5.7587779
                },
                "instruction": "Take the exit toward <span class=\"sign\"><span lang=\"nl\">Rotterdam</span>/<span lang=\"nl\">Tiel</span></span> onto <span class=\"number\">A15</span>. <span class=\"distance-description\">Go for <span class=\"length\">39.8 km</span>.</span>",
                "travelTime": 1735,
                "length": 39789,
                "id": "M8",
                "_type": "PrivateTransportManeuverType"
              },
              {
                "position": {
                  "latitude": 51.8583441,
                  "longitude": 5.2429676
                },
                "instruction": "Take the exit toward <span class=\"sign\"><span lang=\"nl\">Utrecht</span></span> onto <span class=\"number\">A2</span>. <span class=\"distance-description\">Go for <span class=\"length\">59.0 km</span>.</span>",
                "travelTime": 2555,
                "length": 58990,
                "id": "M9",
                "_type": "PrivateTransportManeuverType"
              },
              {
                "position": {
                  "latitude": 52.3197055,
                  "longitude": 4.9161673
                },
                "instruction": "Keep <span class=\"direction\">right</span> onto <span class=\"number\">E35</span> <span class=\"next-street\">(Knooppunt Amstel)</span> toward <span class=\"sign\"><span lang=\"nl\">E19</span>/<span lang=\"nl\">RING</span>/<span lang=\"nl\">Luchthaven Schiphol</span>/<span lang=\"nl\">Zaanstad</span>/<span lang=\"nl\">A10</span></span>. <span class=\"distance-description\">Go for <span class=\"length\">714 m</span>.</span>",
                "travelTime": 32,
                "length": 714,
                "id": "M10",
                "_type": "PrivateTransportManeuverType"
              },
              {
                "position": {
                  "latitude": 52.3259926,
                  "longitude": 4.9142146
                },
                "instruction": "Keep <span class=\"direction\">left</span> onto <span class=\"next-street\">Knooppunt Amstel</span> toward <span class=\"sign\"><span lang=\"nl\">Luchthaven Schiphol</span>/<span lang=\"nl\">A10</span>/<span lang=\"nl\">E19</span></span>. <span class=\"distance-description\">Go for <span class=\"length\">1.1 km</span>.</span>",
                "travelTime": 70,
                "length": 1140,
                "id": "M11",
                "_type": "PrivateTransportManeuverType"
              },
              {
                "position": {
                  "latitude": 52.3305416,
                  "longitude": 4.9042583
                },
                "instruction": "Keep <span class=\"direction\">right</span> onto <span class=\"number\">A10</span> <span class=\"next-street\">(Ring Amsterdam)</span>. <span class=\"distance-description\">Go for <span class=\"length\">6.3 km</span>.</span>",
                "travelTime": 321,
                "length": 6343,
                "id": "M12",
                "_type": "PrivateTransportManeuverType"
              },
              {
                "position": {
                  "latitude": 52.3544562,
                  "longitude": 4.8427069
                },
                "instruction": "Take exit <span class=\"exit\">6</span> toward <span class=\"sign\"><span lang=\"nl\">Osdorp</span>/<span lang=\"nl\">Overtoomse Veld</span>/<span lang=\"nl\">Oud-West</span></span>. <span class=\"distance-description\">Go for <span class=\"length\">367 m</span>.</span>",
                "travelTime": 63,
                "length": 367,
                "id": "M13",
                "_type": "PrivateTransportManeuverType"
              },
              {
                "position": {
                  "latitude": 52.3577499,
                  "longitude": 4.8430288
                },
                "instruction": "Turn <span class=\"direction\">right</span> onto <span class=\"next-street\">Cornelis Lelylaan</span> <span class=\"number\">(s106)</span> toward <span class=\"sign\"><span lang=\"nl\">Oud-West</span>/<span lang=\"nl\">Centrum</span></span>. <span class=\"distance-description\">Go for <span class=\"length\">555 m</span>.</span>",
                "travelTime": 77,
                "length": 555,
                "id": "M14",
                "_type": "PrivateTransportManeuverType"
              },
              {
                "position": {
                  "latitude": 52.3579645,
                  "longitude": 4.8511183
                },
                "instruction": "Keep <span class=\"direction\">left</span> toward <span class=\"sign\"><span lang=\"nl\">De Baarsjes</span></span>. <span class=\"distance-description\">Go for <span class=\"length\">126 m</span>.</span>",
                "travelTime": 31,
                "length": 126,
                "id": "M15",
                "_type": "PrivateTransportManeuverType"
              },
              {
                "position": {
                  "latitude": 52.358104,
                  "longitude": 4.8529422
                },
                "instruction": "Take the <span class=\"exit\">2nd exit</span> from Surinameplein roundabout onto <span class=\"next-street\">Surinameplein</span>. <span class=\"distance-description\">Go for <span class=\"length\">134 m</span>.</span>",
                "travelTime": 39,
                "length": 134,
                "id": "M16",
                "_type": "PrivateTransportManeuverType"
              },
              {
                "position": {
                  "latitude": 52.3590052,
                  "longitude": 4.8534894
                },
                "instruction": "Continue on <span class=\"next-street\">Hoofdweg</span>. <span class=\"distance-description\">Go for <span class=\"length\">719 m</span>.</span>",
                "travelTime": 121,
                "length": 719,
                "id": "M17",
                "_type": "PrivateTransportManeuverType"
              },
              {
                "position": {
                  "latitude": 52.3654734,
                  "longitude": 4.8532104
                },
                "instruction": "Arrive at <span class=\"street\">Hoofdweg</span>.",
                "travelTime": 0,
                "length": 0,
                "id": "M18",
                "_type": "PrivateTransportManeuverType"
              }
            ]
          }
        ],
        "summary": {
          "distance": 183631,
          "trafficTime": 8427,
          "baseTime": 8364,
          "flags": [
            "tollroad",
            "tunnel",
            "motorway",
            "builtUpArea"
          ],
          "text": "The trip takes <span class=\"length\">184 km</span> and <span class=\"time\">2:19 h</span>.",
          "travelTime": 8364,
          "_type": "RouteSummaryType"
        }
      }
    ],
    "language": "en-us"
  }
}

我只需要整个Json字符串中黄色标记的部分(通行时间:8364)。 最简单的方法是什么? 我当前的代码如下所示,它 returns null:

 URL host = new URL(uri);
    HttpURLConnection con = (HttpURLConnection) host.openConnection();
    con.setRequestMethod("GET");


    System.out.println(
        "Response code - message: " + con.getResponseCode() + " - " + con.getResponseMessage());

    if (con.getResponseCode() == HttpURLConnection.HTTP_OK) {
        Reader reader = new InputStreamReader(con.getInputStream(), StandardCharsets.UTF_8);
        Gson gson = new GsonBuilder().create();

con.getResponseMessage 打印连接正常,因此 link 有效。

  1. 我在谷歌上搜索了几个解决方案,但我无法导入必要的库,如果我尝试导入它们以应用我在 Whosebug 上找到的这个解决方案,IntelliJ 会显示错误: How to get the JSON code of a web page

Json 库的导入:

我是导入外部库的新手,所以我不知道如何处理这个问题

感谢您的帮助! :)

如果您正在使用 Gson probaly,请继续这样做,不需要导入任何 Json 库。

JsonParser parser = new JsonParser();
JsonElement json = parser.parse(your_json_string);
JsonArray route = json.getAsJsonObject().get("response").getAsJsonObject().get("route")getAsJsonArray();
int yourTrafficTime = route.get(0).getAsJsonObject().get("summary").getAsJsonObject().get("trafficTime").getAsInt();

您可以创建模型 类 并使用 GSON 来解析它们。这将使您可以轻松访问 json 响应中的任何字段。

  1. 型号类
class ResponseData {
    private Response response;
    // getters and setters
}

class Response {
    private List<Route> route;
    // getters and setters
}

class Route {
    private Summary summary;
    // getters and setters
}

class Summary {
    private Long trafficTime;
    // getters and setters
}
  1. 解析json对模型的响应
Reader reader = new InputStreamReader(con.getInputStream(), StandardCharsets.UTF_8);
Gson gson = new Gson();
ResponseData responseData = gson.fromJson(reader, ResponseData.class);
responseData.getResponse().getRoute().forEach(route -> System.out.println(route.getSummary().getTrafficTime()));

输出:

8427