Gson 无法在 Android (Java) 中序列化 LocalDateTime 数据

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

我正在练习编码并面临与 Java Android 中的 Gson 和 LocalDateTime 相关的问题。 比如我创建了一个Java对象

public class Person {
private String name;
private LocalDateTime createdAt;

// Constructors
// Getters and Setters
}

然后我用 Gson 将这个 Person 对象转换成 Json

Person person = new Person("John Doe", LocalDateTime.now()); //For example: 2022-02-02T11:11:510Z
String personJsonAsString = new Gson().toJson(person);

我希望 Json 应该是

{
"name": "John Doe",
"createdAt": "2022-02-02T11:11:510Z"
}

但我得到的结果是

{
"name": "John Doe",
"createdAt": {} // <- It's empty here
}

之后,我研究发现我可以将自定义序列化器类添加到 GsonBuilder 实例中,所以我再次尝试

Person person = new Person("John Doe", LocalDateTime.now()); //For example: 2022-02-02T11:11:510Z
GsonBuilder builder = new GsonBuilder();
Gson gson = builder.registerTypeAdapter(LocalDateTime.class, new LocalDateTimeJsonSerializer()).create();
String personJsonAsString = gson.toJson(person);

虽然

LocalDateTimeJsonSerializer
是我写的一个类

public class LocalDateTimeJsonSerializer implements JsonSerializer<LocalDateTime> {
    @Override
    public JsonElement serialize(LocalDateTime src, Type typeOfSrc, JsonSerializationContext context) {
        return new JsonPrimitive(src.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
    }
}

当我尝试像这样在 Android 应用程序上持久化数据时抛出异常:

目前,我无法弄清楚是什么导致 Gson 无法在 Android 平台上序列化 LocalDateTime。请帮我。非常感谢您的宝贵时间。

我做了什么尝试: 在 Stackoverflow 上研究其他问题。 尝试任何可用的解决方案。 我期待的是: 我期望知道异常的实际根本原因,而不是修复错误并使其仅运行

java android json serialization gson
1个回答
0
投票

圆孔中的方钉

上错课了。使用

Instant
,而不是
LocalDateTime

public class Person {
    private String name;
    private Instant createdAt;
    …
}

你的输入

"2022-02-02T11:11:510Z"
最后有一个
Z
。该字母表示与 UTC 的零小时-分钟-秒的偏移量。

Instant instant = Instant.parse( "2022-02-02T11:11:510Z" ) ;

LocalDateTime
没有偏移量或时区的任何概念。所以那个类不能代表一个时刻,不是时间轴上的特定点。该类不能代表您输入的含义。该类不能用于记录创建内容的时刻。

您输入的字符串符合 ISO 8601 标准。参见维基百科。

你展示了一行代码:

Person person = new Person("John Doe", LocalDateTime.now());

我无法想象调用

LocalDateTime.now
是正确的做法。

改为:

Person person = new Person( "John Doe" , Instant.now() ) ;
© www.soinside.com 2019 - 2024. All rights reserved.