Как десериализовать разные форматы даты: ГГГГ-ММ-ДД и ГГГГ-ММ - PullRequest
0 голосов
/ 12 мая 2019

У меня есть список объектов json, одно из полей - дата.Проблема в том, что даты пишутся по-разному в json.

большинство из них выглядит так:

 "publishedDate": "2005-01-28"
 "publishedDate": "2011-08-29"
 "publishedDate": "2016-04-19"

Но некоторые из них похожи на:

"publishedDate": "1998-11"
"publishedDate": "2001-01"

Мое поле Java-объекта, в которое я хочу разобрать

private Date publishedDate;

Я получил эту ошибку:

 Cannot deserialize value of type `java.util.Date` from String "2001-01": not a valid representation (error: Failed to parse Date value '2001-01': Cannot parse date "2001-01": while it seems to fit format 'yyyy-MM-dd', parsing fails (leniency? null))

1 Ответ

1 голос
/ 12 мая 2019

Вам необходимо написать собственный десериализатор для Date и в обоих случаях правильно преобразовать в ожидаемую дату.Ниже вы можете найти простой пример, как это сделать:

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;

import java.io.File;
import java.io.IOException;
import java.time.LocalDate;
import java.time.YearMonth;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.List;

public class JsonApp {

    public static void main(String[] args) throws Exception {
        File jsonFile = new File("./resource/test.json").getAbsoluteFile();

        ObjectMapper mapper = new ObjectMapper();
        TypeReference<List<Item>> typeReference = new TypeReference<List<Item>>() {
        };
        List<Item> readValue = mapper.readValue(jsonFile, typeReference);
        System.out.println(readValue);

    }
}

class DifferentFormatsDateJsonDeserializer extends JsonDeserializer<Date> {

    private DateTimeFormatter localDateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
    private DateTimeFormatter yearMonthFormatter = DateTimeFormatter.ofPattern("yyyy-MM");


    @Override
    public Date deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        String value = p.getValueAsString();
        try {
            if (value.length() == 7) {
                YearMonth yearMonth = YearMonth.parse(value, yearMonthFormatter);
                return convertToDateViaInstant(yearMonth.atDay(1));
            } else {
                LocalDate localDate = LocalDate.parse(value, localDateFormatter);
                return convertToDateViaInstant(localDate);
            }
        } catch (Exception e) {
            System.out.println(e);
        }
        return null;
    }

    public Date convertToDateViaInstant(LocalDate dateToConvert) {
        return Date.from(dateToConvert.atStartOfDay()
                .atZone(ZoneId.systemDefault())
                .toInstant());
    }
}

class Item {

    @JsonDeserialize(using = DifferentFormatsDateJsonDeserializer.class)
    private Date publishedDate;

    public Date getPublishedDate() {
        return publishedDate;
    }

    public void setPublishedDate(Date publishedDate) {
        this.publishedDate = publishedDate;
    }

    @Override
    public String toString() {
        return "Item{" +
                "publishedDate=" + publishedDate +
                '}';
    }
}

Над программой для JSON полезная нагрузка:

[
  {
    "publishedDate": "2005-01-28"
  },
  {
    "publishedDate": "1998-11"
  }
]

Отпечатки:

[Item{publishedDate=Fri Jan 28 00:00:00 CET 2005}, Item{publishedDate=Sun Nov 01 00:00:00 CET 1998}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...