Разбор дат Gson: NumberFormatException

Я новичок в java и Gson, и я пытался разобрать дату из API nobelprize.org. Мне удалось проанализировать некоторую информацию, но когда я включаю даты, я, кажется, всегда сталкиваюсь с ошибками. Как мне исправить эту ошибку?

Я пробовал .setDateFormat("гггг-ММ-дд"), но все равно получаю ту же ошибку.

Gson mainparser = new GsonBuilder()
.setDateFormat("yyyy-MM-dd")
.create();

mainparser.fromJson(line, ParsedJson.class);
public class ParsedJson {

    List<Laureates> laureates;

    public List<Laureates> getLaureates() {
        return laureates;
    }

    public void setLaureates(List<Laureates> laureates) {
        this.laureates = laureates;
    }


}
public class Laureates {
    int id;
    String firstname;
    String surname;
    Date born;
    Date died;
    String bornCountry;
    String bornCountryCode;
    String bornCity;
    String diedCountry;
    String diedCountryCode;
    String diedCity;
    String gender;
    List<Prizes> prizes;
...Getters/Setters

}

Это ошибка, которую я получаю:

java.lang.reflect.InvocationTargetException

Caused by: com.google.gson.JsonSyntaxException: java.lang.NumberFormatException: For input string: "1845-03-27"

Caused by: java.lang.NumberFormatException: For input string: "1845-03-27"

* Редактировать: Пример Json

    "laureates": [
        {
            "id": "1",
            "firstname": "Wilhelm Conrad",
            "surname": "Röntgen",
            "born": "1845-03-27",
            "died": "1923-02-10",
            "bornCountry": "Prussia (now Germany)",
            "bornCountryCode": "DE",
            "bornCity": "Lennep (now Remscheid)",
            "diedCountry": "Germany",
            "diedCountryCode": "DE",
            "diedCity": "Munich",
            "gender": "male",
            "prizes": [
                {
                    "year": "1901",
                    "category": "physics",
                    "share": "1",
                    "motivation": "\"in recognition of the extraordinary services he has rendered by the discovery of the remarkable rays subsequently named after him\"",
                    "affiliations": [
                        {
                            "name": "Munich University",
                            "city": "Munich",
                            "country": "Germany"
                        }
                    ]
                }
            ]
        },
]

не могли бы вы опубликовать ответ json

Noman ali abbasi 10.04.2019 08:51

@Nomanaliabbasi Добавлено в правку

YamYam 10.04.2019 08:59
stackoverflow.com/questions/6873020/gson-формат-даты проверить это
Rahul 10.04.2019 09:03

Я рекомендую вам не использовать Date. Этот класс плохо спроектирован и давно устарел. Вместо этого используйте LocalDate из java.time, современный API даты и времени Java.

Ole V.V. 10.04.2019 09:09

Вы уверены, что "id": "1" работает? Он определяется как int в вашем коде.

MC Emperor 10.04.2019 09:53
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
5
919
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете попробовать использовать JsonDeserializer для Date атрибутов.

public class DateDeserializer implements JsonDeserializer<Date> {

   public DateDeserializer() {
   }

    @Override
    public Date deserialize(JsonElement element, Type arg1, JsonDeserializationContext arg2) throws JsonParseException {
        String dateStr = element.getAsString();
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
        try {
            return format.parse(dateStr);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }
}

в классе вашей модели добавьте JsonAdapter для атрибутов

public class Laureates {
    int id;
    String firstname;
    String surname;
    @JsonAdapter(DateDeserializer.class)
    Date born;
    @JsonAdapter(DateDeserializer.class)
    Date died;
    String bornCountry;
    String bornCountryCode;
    String bornCity;
    String diedCountry;
    String diedCountryCode;
    String diedCity;
    String gender;
    List<Prizes> prizes;
...Getters/Setters

}

Глупый вопрос, но как реализовать класс JsonDeserializer из вашего ответа. Как мне кажется, я понимаю это: DateDeserializer не является абстрактным и не переопределяет абстрактный метод, а также это из @Override: метод не переопределяет и не реализует метод из супертипа

YamYam 10.04.2019 09:41

Я не уверен, что понимаю ваш вопрос, но. Я думаю, вы думали, что JsonDeserializer — это пользовательский класс, но это класс gson.

Ergin Ersoy 10.04.2019 09:44

О, извините, я хотел сказать, как бы я включил класс DateDeserializer, так как в настоящее время он, похоже, не переопределяет метод из JsonDeserializer и дает мне не абстрактные/не переопределяет ошибки сверху

YamYam 10.04.2019 09:50
JsonDeserializer не является абстрактным классом. Это интерфейс. Вы не должны получить никаких ошибок. Я не уверен, почему вы получаете эту ошибку. Вам просто нужно было создать файл Java и скопировать класс DateDeserializer выше.
Ergin Ersoy 10.04.2019 09:59

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