如何用UTF-8字符的json 4s序列化JSON?

u3r8eeie  于 2022-11-26  发布在  其他
关注(0)|答案(1)|浏览(118)

我有一个非常简单的例子:

  1. import org.json4s._
  2. import org.json4s.native.JsonMethods._
  3. import org.json4s.JsonDSL._
  4. val json = ("english" -> JString("serialization")) ~ ("japanese" -> JString("シリアライゼーション"))
  5. println(pretty(render(json)))

我从中得到的是:

  1. {
  2. "english":"serialization",
  3. "japanese":"\u30b7\u30ea\u30a2\u30e9\u30a4\u30bc\u30fc\u30b7\u30e7\u30f3"
  4. }

我想要的是这个(完全有效的AFAIK)JSON:

  1. {
  2. "english":"serialization",
  3. "japanese":"シリアライゼーション"
  4. }

我现在找不到它,但我想我在什么地方读到过JSON只需要两个特殊的UTF-8字符来转义。
查看render的代码,似乎String总是对非ASCII字符进行这种额外的双转义。
有谁知道我如何在不对所有UTF-8扩展字符进行双转义的情况下获得有效的JSON吗?这看起来像是一个非常类似的问题:Why does the PHP json_encode function convert UTF-8 strings to hexadecimal entities?

更新:事实证明,这是json 4s中的一个未决问题,其中有一个未决的PR #327,该PR #327已被关闭,而PR #339又在2016年2月13日的提交中合并到3.4版本分支中。

5tmbdcev

5tmbdcev1#

***@0__***,不清楚您的赏金想要得到什么答案。原问题中提到的bug已经修复,您可以自定义是否需要Unicode字符编码。您只需要使用当前版本构建即可,例如使用build.sbt,如下所示:

  1. name := "SO_ScalaJson4sUnicodeChars"
  2. version := "1.0"
  3. scalaVersion := "2.12.1"
  4. libraryDependencies += "org.json4s" %% "json4s-native" % "3.5.1"

正如***@kriegaex***在他的评论中提到的,根据RFC 7159,UTF-8是JSON的默认编码,所以编码并不是严格必要的。这就是为什么默认情况下 * json 4s * 不编码,正如OP所要求的:

  1. package so
  2. import org.json4s.JsonDSL._
  3. import org.json4s._
  4. import org.json4s.native.JsonMethods._
  5. object SOTest extends App {
  6. val json = ("english" -> JString("serialization")) ~ ("japanese" -> JString("シリアライゼーション"))
  7. println(pretty(render(json)))
  8. }

控制台日志:

  1. {
  2. "english":"serialization",
  3. "japanese":"シリアライゼーション"
  4. }

但是,如果出于兼容性原因,您需要对输出进行编码,json 4s也支持。如果您像这样添加自己的customJsonFormats,您将得到编码后的输出:

  1. package so
  2. import org.json4s.JsonDSL._
  3. import org.json4s._
  4. import org.json4s.native.JsonMethods._
  5. object SOTest extends App {
  6. val json = ("english" -> JString("serialization")) ~ ("japanese" -> JString("シリアライゼーション"))
  7. implicit val customJsonFormats = new DefaultFormats {
  8. override def alwaysEscapeUnicode: Boolean = true
  9. }
  10. println(pretty(render(json)))
  11. }

控制台日志:

  1. {
  2. "english":"serialization",
  3. "japanese":"\u30b7\u30ea\u30a2\u30e9\u30a4\u30bc\u30fc\u30b7\u30e7\u30f3"
  4. }
展开查看全部

相关问题