如何解决json4s 总是转义 unicode 字符 €
我尝试使用 json4s 漂亮地编写一个包含 JString
字符的 €
,如下所示:
import org.joda.time.format.ISODateTimeFormat
import org.joda.time.{DateTime,DateTimeZone}
import org.json4s.native.Serialization.writePretty
import org.json4s.{DateFormat,DefaultFormats,Formats,JString}
import java.util.{Date,TimeZone}
object Json4sEncodingTest {
val formats = new Formats {
val dateFormat: DateFormat = new DateFormat {
override def parse(s: String): Option[Date] =
try {
Option(
DateTime
.parse(s,ISODateTimeFormat.dateTimeParser().withZoneUTC())
.withZone(DateTimeZone.forID(timezone.getID))
.toDate
)
} catch {
case e: IllegalArgumentException => None
}
override def format(d: Date): String = DefaultFormats.lossless.dateFormat.format(d)
override def timezone: TimeZone = DefaultFormats.lossless.dateFormat.timezone
}
override def alwaysEscapeUnicode: Boolean = false
}
def main(args: Array[String]): Unit = {
println(writePretty(JString("2€"))(formats))
}
}
结果:
"2\u20ac"
我的预期结果是:
"2€"
我发现在 org.json4s.ParserUtil.quote 中 \u2000 和 \u2100 之间的字符总是被转义。
问题:为什么会这样?
- json4s 版本:3.7.0-M7
- scala 版本:2.12.11
解决方法
如 this github issue 中所述,目前使用 json4s 原生无法做到这一点。检查是否转义的代码是:
(c >= '\u0000' && c <= '\u001f') || (c >= '\u0080' && c < '\u00a0') || (c >= '\u2000' && c < '\u2100')
而 €
不满足此条件。一种可能的解决方案(好吧,某种解决方案)是使用 jackson 而不是 native。然后这将起作用:
import org.json4s.jackson.JsonMethods._
import org.json4s.JsonAST.JString
println(pretty(render(JString("2€"))))
代码在 Scastie 运行。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。