如何反序列化包含由GSON库生成的LocalDate字段的JSON

xu3bshqb  于 2022-11-06  发布在  其他
关注(0)|答案(2)|浏览(183)

我有一个由GSON库生成的JSON字符串,它看起来像:

  1. {
  2. "id": 10,
  3. "articleNumber": 5009,
  4. "processDate": {
  5. "year": 2021,
  6. "month": 1,
  7. "day": 1
  8. },
  9. "price": 1.22
  10. }

我想使用Jackson反序列化上面的JSON。但是由于processDate字段在JSON中的格式,它在processDate字段处失败。
如何使用一些自定义的反序列化器解析上面的JSON字符串?

guykilcj

guykilcj1#

似乎您不情愿地得到了Jackson内置的LocalDateDeserializer来解析您的日期。

  • "2021-1-1"
  • [2021, 1, 1]
  • 18627

但不幸的是不是你的类对象格式

  • { "year": 2021, "month" :1, "day": 1 }

因此,您需要为LocalDate编写自己的反序列化器。这并不困难。

  1. public class LocalDateDeserializer extends JsonDeserializer<LocalDate> {
  2. @Override
  3. public LocalDate deserialize(JsonParser parser, DeserializationContext ctxt)
  4. throws IOException, JsonProcessingException {
  5. JsonNode node = parser.getCodec().readTree(parser);
  6. try {
  7. int year = node.get("year").intValue();
  8. int month = node.get("month").intValue();
  9. int day = node.get("day").intValue();
  10. return LocalDate.of(year, month, day);
  11. } catch (Exception e) {
  12. throw JsonMappingException.from(parser, node.toString(), e);
  13. }
  14. }
  15. }

然后,在Java类中,您需要告诉Jackson,您希望其processDate属性由您自己的LocalDateDeserializer反序列化。

  1. public class Root {
  2. private int id;
  3. private int articleNumber;
  4. @JsonDeserialize(using = LocalDateDeserializer.class)
  5. private LocalDate processDate;
  6. private double price;
  7. // getters and setters (omitted here for brevity)
  8. }
展开查看全部
wtlkbnrh

wtlkbnrh2#

我对java不是很了解,只是做了一个像这样的自定义类型。下面只是创建了一个像这样的自定义结构:

  1. inline class processDate {
  2. int year,
  3. int month,
  4. int day,
  5. public Date getDate(){
  6. DateFormat formatter = new SimpleDateFormat("dd-MMM-yy");
  7. Date date = formatter.parse(this.day + "-" + this.month + "-" + this.year);
  8. return date;
  9. }
  10. }

相关问题