如何将localdatetime序列化为字符串

时间:2019-08-19 21:26:17

标签: java json gson

序列化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

(这只是一个示例,用于说明我的网站所陈述的问题,但是我的真实代码更加复杂)

在Andreas指出另一个问题之后:

我添加了以这种方式序列化的客户:

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就像对象

0 个答案:

没有答案