序列化localdatetime时,我得到一个完整的JSON对象,而我只需要字符串表示形式。
我为您创建了一个简单的代码,以便您可以轻松重现该问题。
这是我的简单课程
@Getter
@Setter
@Accessors(chain = true)
@ToString
public class Player {
private String name;
private Info info;
@Getter
@Setter
@Accessors(chain = true)
@ToString
public static class Info {
private int number;
private LocalDateTime started;
}
}
我创建了我的客户序列化器:
public class PlayerSerializer implements JsonSerializer<Player> {
@Override
public JsonElement serialize
(Player src, Type typeOfSrc, JsonSerializationContext context) {
JsonObject jObject = new JsonObject();
jObject.addProperty("name", src.getName());
jObject.add("info", new Gson().toJsonTree(src.getInfo()));
return jObject;
}
然后我创建了一个测试以序列化对象:
public class PlayerTester {
@Test
public void test() {
Player player = new Player().setName("my name").setInfo(new Player.Info().setNumber(10).setStarted(LocalDateTime.parse("2011-10-10T01:45:20+00:00", DateTimeFormatter.ISO_OFFSET_DATE_TIME)));
GsonBuilder gsonBuilder = new GsonBuilder()
.registerTypeAdapter(PlayerSerializer.class, new PlayerSerializer());
String string = gsonBuilder.create().toJson(player);
System.out.println(string);
}
}
输出在这里:
{"name":"my name","info":{"number":10,"started":{"date":{"year":2011,"month":10,"day":10},"time":{"hour":1,"minute":45,"second":20,"nano":0}}}}
如您所见,日期时间被序列化为对象,而我希望这样: 2011-10-10T01:45:20 + 00:00
(这只是一个示例,用于说明我的网站所陈述的问题,但是我的真实代码更加复杂)
我添加了以这种方式序列化的客户:
GsonBuilder gsonBuilder = new GsonBuilder()
.registerTypeAdapter(LocalDateTime.class, UTC_SER)
.registerTypeAdapter(PlayerSerializer.class, new PlayerSerializer())
;
并定义它:
public static JsonSerializer<LocalDateTime> UTC_SER= (src, typeOfSrc, context) -> {
return new JsonPrimitive(src.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME));
};
但没有任何改变,仍然localdatetime就像对象