Элементы массива JSON в ArrayList для JSP

Я пытаюсь добавить определенные значения из следующего JSON в Java ArrayList. Затем я хотел бы использовать этот ArrayList в JSP. Это JSON:

{
"page": 1,
"rpp": 3,
"total": 3294,
"request_time": "2018-04-23T16:10:20+01:00",
"stops": [
{
  "atcocode": "370023715",
  "longitude": -1.46616,
  "latitude": 53.38248,
  "distance": 57
},
{
  "atcocode": "370027281",     
  "longitude": -1.46583,
  "latitude": 53.38228,
  "distance": 77
},
{
  "atcocode": "370022803",
  "longitude": -1.46616,
  "latitude": 53.38227,
  "distance": 80
 }
]
}

Я хотел бы добавить каждый элемент долготы и широты из-под поддерева "остановок" в 2 разных списка ArrayList. Это мой код для этого:

public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{

    try {
        String json = readUrl (link);
        JsonParser parser = new JsonParser();
        JsonElement element = parser . parse (json);

        if (element.isJsonObject()) {
            JsonObject bus = element . getAsJsonObject ();

            JsonArray array = bus . getAsJsonArray ("stops");
            for (int i = 0; i < array.size(); i++) {
                List<String> longitudes = new ArrayList<String>();
                List<String> latitudes = new ArrayList<String>();

                longitudes.add(array.get(i)).get("longitude");
                latitudes.add(array.get(i)).get("latitude");
                request.setAttribute("longitudes", longitudes);
                request.setAttribute("latitudes", latitudes);


                RequestDispatcher dispatcher = request . getRequestDispatcher ("latlong.jsp");
                dispatcher.forward(request, response);    
            }
        }
    }
}

я получаю следующую ошибку: «ошибка: несовместимые типы: JsonElement не может быть преобразован в String»

Заранее спасибо!

Это просто проблема с паренами? Похоже, вы полностью игнорируете широту / долготу ... Попробуйте вместо этого longitudes.add(array.get(i).get("longitude"));

Max Friederichs 23.04.2018 19:04
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
233
2

Ответы 2

Вместо

longitudes.add(array.get(i)).get("longitude");
latitudes.add(array.get(i)).get("latitude");

Использовать

longitudes.add(array.get(i).get("longitude").getAsString());
latitudes.add(array.get(i).get("latitude").getAsString());

Благодарность! Я все еще получаю ту же ошибку, я буду пытаться

kieron 23.04.2018 19:09

Обновлено, пожалуйста, попробуйте

Shanu Gupta 23.04.2018 19:10

Не могли бы вы указать полную трассировку стека с помощью моего кода. Я уверен, что код в ответе должен решить эту проблему. Вы видели последнее изменение?

Shanu Gupta 23.04.2018 19:15

Еще одна ошибка заключается в том, что списки longitudes, latitudes находятся внутри цикла.

Вот простой тестируемый фрагмент кода, который извлекает данные из JSON и может быть протестирован локально. Вы можете адаптировать его под свои цели ...

public static void main(String[] args) {
    String json = "{\n" +
            "\"page\": 1,\n" +
            "\"rpp\": 3,\n" +
            "\"total\": 3294,\n" +
            "\"request_time\": \"2018-04-23T16:10:20+01:00\",\n" +
            "\"stops\": [\n" +
            "{\n" +
            "  \"atcocode\": \"370023715\",\n" +
            "  \"longitude\": -1.46616,\n" +
            "  \"latitude\": 53.38248,\n" +
            "  \"distance\": 57\n" +
            "},\n" +
            "{\n" +
            "  \"atcocode\": \"370027281\",     \n" +
            "  \"longitude\": -1.46583,\n" +
            "  \"latitude\": 53.38228,\n" +
            "  \"distance\": 77\n" +
            "},\n" +
            "{\n" +
            "  \"atcocode\": \"370022803\",\n" +
            "  \"longitude\": -1.46616,\n" +
            "  \"latitude\": 53.38227,\n" +
            "  \"distance\": 80\n" +
            " }\n" +
            "]\n" +
            "}";
    JsonParser jsonParser = new JsonParser();
    JsonElement element = jsonParser.parse(json);
    List<String> longitudes = new ArrayList<>();
    List<String> latitudes = new ArrayList<>();
    if (element.isJsonObject()) {
        JsonObject bus = element . getAsJsonObject ();
        JsonArray array = bus.getAsJsonArray("stops");
        array.forEach(jsonElement -> {
            extractToList(longitudes, (JsonObject) jsonElement, "longitude");
            extractToList(latitudes, (JsonObject) jsonElement, "latitude");
        });
    }
    System.out.println(longitudes);
    System.out.println(latitudes);
}

private static void extractToList(List<String> list, JsonObject jsonElement, String field) {
    final JsonElement longitude = jsonElement.get(field);
    if (longitude != null) {
        list.add(longitude.getAsString());
    }
}

Если вы запустите это, вы получите распечатку на консоли:

[-1.46616, -1.46583, -1.46616]
[53.38248, 53.38228, 53.38227]

Я предположил, что вы используете библиотеку Google GSON.

Другие вопросы по теме