如何使用json4s以UTF-8字符序列化JSON?

前端之家收集整理的这篇文章主要介绍了如何使用json4s以UTF-8字符序列化JSON?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个很简单的例子:
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.

任何人知道如何获得有效的JSON,而不需要双重转义所有的UTF-8扩展字符?这似乎是一个非常类似的问题: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__,不清楚你想要得到什么答案你的赏金.原始问题中提到的错误已经修复,因此您可以自定义是否要对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:我决定编辑这个答案,合并我自己的一些信息,并修复了一些小问题.我这样做是为了避免冗余.我更喜欢一个好的,一致的答案,而不是赏金.我现在要删除我的

猜你在找的JavaScript相关文章