如何在API中使用Gson库获取当前本地日期时间

问题描述 投票:0回答:1

我正在尝试在 API 中获取 JSON 响应中的 LocalDateTime 。

用于序列化/反序列化,使用Google的Gson库

下面是代码... 对象模型如下....

import java.time.LocalDateTime;
import java.time.OffsetDateTime;
import com.google.gson.annotations.Expose;

public class AddTenResponseData {
    
    @Expose Object id;
    @Expose OffsetDateTime timestamp;
    
    public AddTennatResponseData (Object id, OffsetDateTime timestamp) {
        
        this.id = id;
        this.timestamp = timestamp;
    }

   <<getter setters >>
}

API代码如下

@GetMapping("/ten/add")
    @ResponseBody
    public String addTenant() throws Exception {

    <<all other code>>

Gson gson = new GsonBuilder().setPrettyPrinting()
            .excludeFieldsWithoutExposeAnnotation()
            .create();

    AddTenResponseData res = new AddTenResponseData (generatedString, OffsetDateTime.now());
    str = gson.toJson(res);
    return str;
}   

回复是这样的

{
  "id": "weHhAQQqxG",
  "timestamp": {}
}

    

现在的问题是, str 只包含 generatedString 变量的值,但不包含 timestamp 中的本地日期时间值,不知道为什么。

请推荐

java gson
1个回答
2
投票

我认为问题与您的

OffsetDateTime
类中
AddTenResponseData
字段的序列化有关。

默认情况下,Gson 没有内置对

OffsetDateTime
的支持。

您需要为

serializer
类型提供自定义
deserializer
OffsetDateTime

我添加了示例代码,您可以修改代码来处理

OffsetDateTime
序列化和反序列化:

首先,为 OffsetDateTime 添加自定义序列化器和反序列化器:

import java.lang.reflect.Type;
import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;
import com.google.gson.*;

public class OffsetDateTimeSerializer implements JsonSerializer<OffsetDateTime>, JsonDeserializer<OffsetDateTime> {

    private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ISO_OFFSET_DATE_TIME;

    @Override
    public JsonElement serialize(OffsetDateTime src, Type typeOfSrc, JsonSerializationContext context) {
        return new JsonPrimitive(FORMATTER.format(src));
    }

    @Override
    public OffsetDateTime deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
            throws JsonParseException {
        return OffsetDateTime.parse(json.getAsString(), FORMATTER);
    }
}

其次,在创建Gson实例时注册自定义序列化器和反序列化器:

Gson gson = new GsonBuilder()
    .setPrettyPrinting()
    .excludeFieldsWithoutExposeAnnotation()
    .registerTypeAdapter(OffsetDateTime.class, new OffsetDateTimeSerializer())
    .create();

我认为通过这些更改,Gson 将使用您自定义的

serializer
deserializer
来表示
OffsetDateTime
,确保它在 JSON 响应中正确序列化和反序列化。

© www.soinside.com 2019 - 2024. All rights reserved.