Я новичок в 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"
}
]
}
]
},
]
@Nomanaliabbasi Добавлено в правку
Я рекомендую вам не использовать Date
. Этот класс плохо спроектирован и давно устарел. Вместо этого используйте LocalDate
из java.time, современный API даты и времени Java.
Вы уверены, что "id": "1"
работает? Он определяется как int
в вашем коде.
Вы можете попробовать использовать 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: метод не переопределяет и не реализует метод из супертипа
Я не уверен, что понимаю ваш вопрос, но. Я думаю, вы думали, что JsonDeserializer
— это пользовательский класс, но это класс gson
.
О, извините, я хотел сказать, как бы я включил класс DateDeserializer, так как в настоящее время он, похоже, не переопределяет метод из JsonDeserializer и дает мне не абстрактные/не переопределяет ошибки сверху
JsonDeserializer
не является абстрактным классом. Это интерфейс. Вы не должны получить никаких ошибок. Я не уверен, почему вы получаете эту ошибку. Вам просто нужно было создать файл Java и скопировать класс DateDeserializer
выше.
не могли бы вы опубликовать ответ json