Gson.from Json застрял на линии - PullRequest
0 голосов
/ 22 февраля 2020

Я использую gson для анализа данных, поступающих из объекта HttpExchange. Тем не менее, в моей IDE я установил точку останова на строке, где я использую .fromjson, и она никогда не перемещается за эту линию. Это возвращается к нему снова и снова.

public void handle(HttpExchange exchange) throws IOException {
        System.out.println("/createTest");
        if (exchange.getRequestMethod().toLowerCase().equals("post")){
            System.out.println("get request");

            InputStream reqBody = exchange.getRequestBody();
            String reqData = readString(reqBody);

            Gson gson = new Gson();
            TestRequest testRequest = new TestRequest();
            System.out.println(reqData);
            testRequest = gson.fromJson(reqData, TestRequest.class);
            System.out.println("gson done");

            //Get the test
            TestService testService = new TestService();
            TestResponse result = testService.execute(testRequest);}

Вот обновленный java для TestRequest. java

import Model.TestParameter;

import java.util.ArrayList;
import java.util.HashMap;

public class TestRequest {
private HashMap<ArrayList<Integer>, book> sections;
private int difficulty;
private boolean closedBook;
private int length;
private int assortment;

Я использовал JSONlint, чтобы проверить, что данные JSON, которые я передавал, были правильными, и это было. Вот он, для любопытных:

{
  "sections": [
    {
      "chapters": [
        11,
        12,
        20,
        21,
        22
      ],
      "book": "NEPHI1"
    },
    {
      "chapters": [
        20,
        29
      ],
      "book": "NEPHI2"
    },
    {
      "chapters": [
        1
      ],
      "book": "OMNI"
    }
  ],
  "difficulty": 3,
  "closedBook": true,
  "length": 21,
  "assortment": 0
}

1 Ответ

1 голос
/ 24 апреля 2020
private HashMap<ArrayList<Integer>, book> sections;

Гсон считает, что ваше поле sections должно быть картой ...

"sections": [

... но вместо этого у вас есть массив элементов, каждый из которых является объектом с chapters (массив целых чисел) и book (строка). Map и HashMap принимают два обобщенных c аргумента, где первый является ключом, а второй - значением. В JSON ключ почти всегда будет String, как в этом JSON, представляющем HashMap<String, Integer>:

{
  "abc": 123,
  "def": 456
}

Если вы хотите соответствовать JSON, который вы указали вам понадобится sections, чтобы выглядеть примерно так:

public class Section {
  private ArrayList<Integer> chapters;
  private String book;
}
private ArrayList<Section> sections;

Однако в моей IDE я установил точку останова на строке, где я использую .fromjson, и это никогда не проходит мимо этой строки.

Звучит так, будто вы понимаете try / catch в комментариях, но для заголовка вашего вопроса "застрял в строке" и этой цитаты в вашем вопросе, я ' Подведем итоги.

Когда в приложении Java происходит что-то неожиданное или ошибочное («исключение», как в com.google.gson.JsonSyntaxException), оно будет искать ближайший включающий try / catch блок. Если в текущем методе его нет, он проверит метод, вызвавший текущий метод, а затем метод, вызвавший , метод и т. Д. Приложения веб-сервера часто имеют вложенный try / catch, который приводит к коду ошибки, например 500, и, если вообще ничего не перехватывается, это может привести к завершению программы. Вы можете узнать больше об Исключениях в учебнике Java «Что такое Исключение?» , но появление этого «зависания» в этой строке, вероятно, является результатом того, что он переходит в обработчик исключений по умолчанию и никогда не возвращаться к методу, в котором было «выброшено» исключение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...