Java GSON 在自定义序列化程序中转义反斜杠
Java GSON Escaping backslashes in a custom serializer
我需要将 Java LocalDate(例如 2020-02-04)序列化为以下格式:
"myProperty":"\/Date(-2209165200000+0100)\/"
,因为我们使用的界面要求该格式。
我们目前使用的是最新版本的 GSON (2.8.6)
我们的自定义 LocalDate Serializer 目前看起来像这样:
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 中,您不能简单地使用像 "\/"
这样的字符串,因为这会导致编译器错误。
有什么简单的方法可以用单反斜杠得到我们的结果吗?
谢谢和亲切的问候:)
马可
如 RFC 7159 中所述,\/
表示转义的正斜杠并解码为 \
。
因此,您想 return context.serialize("/Date(" + timeInMillis + offset + ")/");
。
我们通过返回一个新的 JsonPrimitive
而不是使用 context
来解决我们的问题
所以我们现在正在使用 return new JsonPrimitive("/Date(" + timeInMillis + offset + ")/");
,现在一切正常。仍然感谢您的意见,非常感谢!
我需要将 Java LocalDate(例如 2020-02-04)序列化为以下格式:
"myProperty":"\/Date(-2209165200000+0100)\/"
,因为我们使用的界面要求该格式。
我们目前使用的是最新版本的 GSON (2.8.6)
我们的自定义 LocalDate Serializer 目前看起来像这样:
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 中,您不能简单地使用像 "\/"
这样的字符串,因为这会导致编译器错误。
有什么简单的方法可以用单反斜杠得到我们的结果吗?
谢谢和亲切的问候:)
马可
如 RFC 7159 中所述,\/
表示转义的正斜杠并解码为 \
。
因此,您想 return context.serialize("/Date(" + timeInMillis + offset + ")/");
。
我们通过返回一个新的 JsonPrimitive
而不是使用 context
所以我们现在正在使用 return new JsonPrimitive("/Date(" + timeInMillis + offset + ")/");
,现在一切正常。仍然感谢您的意见,非常感谢!