我有一个非常简单的例子:
import org.json4s._
import org.json4s.native.JsonMethods._
import org.json4s.JsonDSL._
val json = ("english" -> JString("serialization")) ~ ("japanese" -> JString("シリアライゼーション"))
println(pretty(render(json)))
我从中得到的是:
{
"english":"serialization",
"japanese":"\u30b7\u30ea\u30a2\u30e9\u30a4\u30bc\u30fc\u30b7\u30e7\u30f3"
}
我想要的是这个(完全有效的 AFAIK)JSON:
{
"english":"serialization",
"japanese":"シリアライゼーション"
}
我现在找不到它,但我想我在某处读到 JSON 只需要转义两个特殊的 UTF-8 字符。
查看 render 的代码,看来 Strings always get this extra double-escaping for non-ASCII characters .
任何人都知道如何在不双重转义所有 UTF-8 扩展字符的情况下获得有效的 JSON?这似乎与以下问题非常相似:Why does the PHP json_encode function convert UTF-8 strings to hexadecimal entities?
更新 :事实证明这是 json4s 中的一个未决问题,有一个待处理的 PR #327已关闭以支持 PR #339它又合并到 commit on Feb 13, 2016 中的 3.4 版本分支中.
最佳答案
@0__ ,目前还不清楚你想用你的赏金得到什么答案。原问题中提到的bug已经修复,可以自定义是否要编码Unicode字符。您只需要使用当前版本进行构建,例如与 build.sbt
像这样:
name := "SO_ScalaJson4sUnicodeChars"
version := "1.0"
scalaVersion := "2.12.1"
libraryDependencies += "org.json4s" %% "json4s-native" % "3.5.1"
如 @kriegaex 在他的评论中提到,根据 RFC 7159,UTF-8 是 JSON 的默认编码,因此编码不是绝对必要的。这就是默认情况下 json4s 不编码的原因,正如 OP 要求的那样:
package so
import org.json4s.JsonDSL._
import org.json4s._
import org.json4s.native.JsonMethods._
object SOTest extends App {
val json = ("english" -> JString("serialization")) ~ ("japanese" -> JString("シリアライゼーション"))
println(pretty(render(json)))
}
控制台日志:
{
"english":"serialization",
"japanese":"シリアライゼーション"
}
但是,如果出于某种兼容性原因您需要对输出进行编码,json4s 也支持。如果您添加自己的
customJsonFormats
像这样,你得到编码输出:package so
import org.json4s.JsonDSL._
import org.json4s._
import org.json4s.native.JsonMethods._
object SOTest extends App {
val json = ("english" -> JString("serialization")) ~ ("japanese" -> JString("シリアライゼーション"))
implicit val customJsonFormats = new DefaultFormats {
override def alwaysEscapeUnicode: Boolean = true
}
println(pretty(render(json)))
}
控制台日志:
{
"english":"serialization",
"japanese":"\u30b7\u30ea\u30a2\u30e9\u30a4\u30bc\u30fc\u30b7\u30e7\u30f3"
}
@kriegaex 更新:我决定编辑这个答案,合并我自己的一些信息并修复一些小问题。我这样做是为了避免冗余。我对一个好的、一致的答案比对赏金更感兴趣。我现在要删除我的。
关于json - 如何使用带有 UTF-8 字符的 json4s 序列化 JSON?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35168453/