json - 如何使用带有 UTF-8 字符的 json4s 序列化 JSON?

标签 json scala serialization utf-8 json4s

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

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/

相关文章:

javascript - 将 HTML div 内容转换为 json 对象

java - 如何在 scala 中重写此 java 函数并保持相同的可选输入参数?

scala - 用Scala删除字符串中的空格

java - Jackson - 如何处理(反序列化)嵌套的 JSON?

javascript - JavaScript 中的 JSON 递归树

android - 使用 Gson 将 JSON 转换为 Android 中的 ListView

java - 如何在 Java 中序列化 AttributedString?

c++ - Qt - 序列化 "double"时出现问题

c# - DataContractJsonSerializer 异常

scala - 如何允许可选的最外括号?