我尝试编写一个包含带有JString的€字符的json4s,如下所示:
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中,\u 2000到\u 2100之间的字符总是转义的。
问题:为什么会这样?
发布于 2021-01-17 07:07:07
正如在这个github问题中阐述的那样,目前不可能使用json4s本机来完成这一任务。检查是否要转义的代码是:
(c >= '\u0000' && c <= '\u001f') || (c >= '\u0080' && c < '\u00a0') || (c >= '\u2000' && c < '\u2100')而€不满足这个条件。一个可能的解决方案(嗯,某种程度上的解决方案)是使用jackson而不是本地的。那么,这将是可行的:
import org.json4s.jackson.JsonMethods._
import org.json4s.JsonAST.JString
println(pretty(render(JString("2€"))))代码在斯卡斯蒂上运行。
https://stackoverflow.com/questions/65706000
复制相似问题