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

Posted

技术标签:

【中文标题】如何反序列化包含 GSON 库生成的 LocalDate 字段的 JSON【英文标题】:How to deserialize JSON containing LocalDate field generated by GSON library 【发布时间】:2021-12-06 08:52:59 【问题描述】:

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


    "id": 10,
    "articleNumber": 5009,
    "processDate": 
      "year": 2021,
      "month": 1,
      "day": 1
    ,
    "price": 1.22

我想使用 Jackson 来反序列化上述 JSON。但由于 processDate 字段在 JSON 中的格式,它在 processDate 字段中失败。

如何使用一些自定义的反序列化器来解析上面的 JSON 字符串?

【问题讨论】:

这能回答你的问题吗? Spring Boot LocalDate field serialization and deserialization @ℛɑƒæĿᴿᴹᴿ 日期字段不是对象格式。就像 "processDate" : "2021-01-01" 为什么不简单地将其设置为 ISO 8601 格式,以便 每个 您的组件(当然至少 Java 8 Time API 知道)可以意识到这一点?首先将LocalDate-to-String 序列化程序添加到Gson 【参考方案1】:

看来你不情愿地得到了杰克逊的内置 LocalDateDeserializer 解析您的日期。 这个反序列化器支持多种 JSON 日期格式 (字符串、整数数组、历元天数)

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

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

"year": 2021, "month" :1, "day": 1

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

public class LocalDateDeserializer extends JsonDeserializer<LocalDate> 

    @Override
    public LocalDate deserialize(JsonParser parser, DeserializationContext ctxt)
            throws IOException, JsonProcessingException 
        JsonNode node = parser.getCodec().readTree(parser);
        try 
            int year = node.get("year").intValue();
            int month = node.get("month").intValue();
            int day = node.get("day").intValue();
            return LocalDate.of(year, month, day);
         catch (Exception e) 
            throw JsonMappingException.from(parser, node.toString(), e);
        
    

然后,在您的 Java 课程中,您需要告诉杰克逊, 你希望它的processDate 属性被反序列化 由你自己的LocalDateDeserializer

public class Root 

    private int id;

    private int articleNumber;

    @JsonDeserialize(using = LocalDateDeserializer.class)
    private LocalDate processDate;

    private double price;
    
    // getters and setters (omitted here for brevity)

【讨论】:

【参考方案2】:

我不太了解java,只是制作一个这样的自定义类型。以下 只需创建一个自定义结构,例如:

inline class processDate 
    int year,
    int month,
    int day,
    public Date getDate()
        DateFormat formatter = new SimpleDateFormat("dd-MMM-yy");
        Date date = formatter.parse(this.day + "-" + this.month + "-" + this.year);
        return date;
    


【讨论】:

以上是关于如何反序列化包含 GSON 库生成的 LocalDate 字段的 JSON的主要内容,如果未能解决你的问题,请参考以下文章

怎样在androidstudio中导入gson包

怎么在eclipse中导入gson和dom4

完全理解Gson:Gson反序列化

让我们畅通无阻:在 Scala 中使用 GSON 读取 Json

如何使用 Gson 反序列化 XMLGregorianCalender?

如何实现 Gson 序列化/反序列化过程中 过滤指定字段