如何在不将 LocalDateTime 字段转换为扩展的 json 对象的情况下将 java 对象转换为简单的 json 字符串?
Posted
技术标签:
【中文标题】如何在不将 LocalDateTime 字段转换为扩展的 json 对象的情况下将 java 对象转换为简单的 json 字符串?【英文标题】:How to convert a java object to simple json string without converting the LocalDateTime field to an extended json object? 【发布时间】:2020-12-16 09:08:10 【问题描述】:我需要帮助将 java 对象转换为 json 字符串,而无需将 LocalDateTime 字段转换为单独的对象。
class MyObj
LocalDateTime date;
那么,
MyObj dateObj = new MyObj();
dateObj.date = LocalDateTime.now();
当我将其转换为 json 时,
Gson gson = new GsonBuilder().setDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz").create();
gson.toJson(dateObj);
我得到了这个:
"date":
"date":
"year": 2020,
"month": 8,
"day": 27
,
"time":
"hour": 8,
"minute": 59,
"second": 47,
"nano": 0
但我想要这个:
"date" : "2020-08-27T08:59:470Z"
请帮助我。
【问题讨论】:
【参考方案1】:我就是这样解决的。
创建一个 Gson 对象:
Gson gson = new GsonBuilder()
.setPrettyPrinting()
.registerTypeAdapter(LocalDate.class, new LocalDateAdapter())
.create();
使用方法如下:
String jsonRequestString = gson.toJson(request);
创建一个序列化器:
class LocalDateAdapter implements JsonSerializer<LocalDate>
@Override
public JsonElement serialize(LocalDate date, java.lang.reflect.Type typeOfSrc, JsonSerializationContext context)
return new JsonPrimitive(date.format(DateTimeFormatter.ISO_LOCAL_DATE));
【讨论】:
【参考方案2】:根据javadoc 的setDateFormat
日期格式将用于序列化和反序列化 @link java.util.Date、@link java.sql.Timestamp 和 @link java.sql.Date。
您需要为LocalDateTime.class
注册自定义序列化程序
JsonSerializer<LocalDateTime> localDateTimeSerializer = (src, type, context) ->
String date = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss").format(src);
// String date = DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(src);
// String date = src.toString();
return new JsonPrimitive(date);
;
Gson gson = new GsonBuilder().registerTypeAdapter(LocalDateTime.class, localDateTimeSerializer).create();
gson.toJson(dateObj);
注意: LocalDateTime 不存储时区信息,因此您实际上不能在日期格式模式中使用 Z
。
【讨论】:
以上是关于如何在不将 LocalDateTime 字段转换为扩展的 json 对象的情况下将 java 对象转换为简单的 json 字符串?的主要内容,如果未能解决你的问题,请参考以下文章
有啥方法可以在不将 CIImage 转换为 UIImage 或 CGImage 的情况下将 CIImage 转换为 NSData?
Spring Data with Redis:如何使用不同的 LocalDateTime 格式或不同的转换器?