【问题标题】:Java GSON Escaping backslashes in a custom serializerJava GSON在自定义序列化程序中转义反斜杠
【发布时间】:2020-02-04 16:23:54
【问题描述】:

我需要将 Java LocalDate(例如 2020-02-04)序列化为以下格式: "myProperty":"\/Date(-2209165200000+0100)\/",作为我们使用的接口请求该格式。 我们目前使用的是最新版本的 GSON (2.8.6)

我们的自定义 LocalDate 序列化器现在看起来像这样:

public class LocalDateSerializer implements JsonSerializer<LocalDate> {

  @Override
    public JsonElement serialize(LocalDate src, Type typeOfSrc, JsonSerializationContext context) {
        Instant instant = src.atStartOfDay(ZoneId.systemDefault()).toInstant();
        long timeInMillis = instant.toEpochMilli();
        ZoneOffset offset = OffsetDateTime.now().getOffset();
        return context.serialize("\\/Date(" + timeInMillis + offset + ")\\/");
    }
}

现在的问题是,据我所知,context.serialize 函数转义了双反斜杠,所以最终结果是 "myProperty":"\\/Date(-2209165200000+0100)\\/" 而不是 "myProperty":"\/Date(-2209165200000+0100)\/" 在 Java 1.8 中,您不能简单地使用像 "\/" 这样的字符串,因为这会导致编译器错误。

有没有什么简单的方法可以用单反斜杠得到我们的结果?

感谢和亲切的问候:)

马可

【问题讨论】:

    标签: java json serialization gson escaping


    【解决方案1】:

    RFC 7159 中所述,\/ 表示转义的正斜杠并解码为\

    因此,您想返回context.serialize("/Date(" + timeInMillis + offset + ")/");

    【讨论】:

      【解决方案2】:

      我们通过返回一个新的JsonPrimitive 而不是使用context 解决了我们的问题

      所以我们现在使用return new JsonPrimitive("/Date(" + timeInMillis + offset + ")/");,现在一切正常。仍然感谢您的意见,非常感谢!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-09
        • 1970-01-01
        • 2013-03-09
        • 2016-06-03
        • 2011-04-25
        相关资源
        最近更新 更多