如何在不将 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 格式或不同的转换器?

在不将单个像素值转换为浮点数的情况下调整目标分割图的大小

有没有办法在不将完整文件加载到内存的情况下将 tiff 图像转换为 Base64

如何在不将其添加到子视图的情况下截取 uiview?

INSERT IF NOT EXISTS 类型函数供我在不将列转换为主键的情况下使用?