我正在练习编码并面临与 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 上研究其他问题。 尝试任何可用的解决方案。 我期待的是: 我期望知道异常的实际根本原因,而不是修复错误并使其仅运行
上错课了。使用
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() ) ;