我有一大堆的文件中的Apache Lucene的坚持与俄罗斯的一些名字,当我试图把它们打印出来,它看起来像这样"\u0410\u0441\u043f\u0430\u0440"
,但不是在西里尔符号。 该项目是在Scala中。 我试图与Apache下议院解决这个unescapeJava
方法,但它并没有帮助。 是否还有其他选择吗?
更新简介:项目writen喷雾框架并返回JSON这样。
{
"id" : 0,
"name" : "\u0410\u0441\u043f\u0430\u0440"
}
我要去尝试推断你在做什么。 您正在使用喷雾,所以我推测,您使用的是它的JSON库“喷雾JSON”
所以我想,你有一些实例spray.json.JsObject
,和您在您的问题发布什么是什么您在打印这种情况时,你得到的输出。 您的JSON对象是正确的,价值name
字段没有嵌入式转义,它实际上是转换为字符串逃脱一些Unicode字符。
见定义printString
这里: https://github.com/spray/spray-json/blob/master/src/main/scala/spray/json/JsonPrinter.scala
我也认为,当您尝试使用unescapeJava
,你应用它的价值name
字段中,创建一个新的spray.json.JsObject
实例,你再印像以前一样。 鉴于您的JSON对象实际上没有进行转义处理,在打印时,打印机将逃逸不如以前了,你又回到了起点,这并没有什么是绝对,然后。
作为一个侧面说明,这是值得一提的是,JSON规范并不强制字符编码方式:可将它们存储为自己的字面值,或者为Unicode逃逸。 举例字符串"abc"
可以描述为只是"abc"
,或"\u0061\u0062\u0063"
。 无论哪种形式是正确的。 碰巧的是喷雾JSON笔者决定采用后者,是所有非ASCII字符。
所以,现在你问,我能做些什么来解决此问题? 你可以问喷雾JSON笔者补充一点,让您可以指定不希望任何Unicode逃逸的选项。 但我想,你想办法解决现在 。
做最简单的事情就是刚刚你的对象转换为字符串(通过JsValue.toString
或JsValue.compactPrint
或JsValue.prettyPrint
), 然后结果传递给unescapeJava
。 至少,这会给你回你的西里尔原始字符。 但是,这是一个有点恶心了,和一些字符是不安全的字符串文本内反转义其实是相当危险的。 举例: \n
将被转义为实际的回报, \u0022
将被转义,以"
你可以很容易地看到它是如何打破你的JSON文件,但起码它将使确认我的理论(记得我。已作出有关究竟你正在做的假设)。
现在,一个适当的解决办法:你可以简单地扩展JsonPrinter
并覆盖其printString
方法来删除的Unicode escapting。 事情是这样的(未经测试):
trait NoUnicodeEscJsonPrinter extends JsonPrinter {
override protected def printString(s: String, sb: StringBuilder) {
@tailrec
def printEscaped(s: String, ix: Int) {
if (ix < s.length) {
s.charAt(ix) match {
case '"' => sb.append("\\\"")
case '\\' => sb.append("\\\\")
case x if 0x20 <= x && x < 0x7F => sb.append(x)
case '\b' => sb.append("\\b")
case '\f' => sb.append("\\f")
case '\n' => sb.append("\\n")
case '\r' => sb.append("\\r")
case '\t' => sb.append("\\t")
case x => sb.append(x)
}
printEscaped(s, ix + 1)
}
}
sb.append('"')
printEscaped(s, 0)
sb.append('"')
}
}
trait NoUnicodeEscPrettyPrinter extends PrettyPrinter with NoUnicodeEscJsonPrinter
object NoUnicodeEscPrettyPrinter extends NoUnicodeEscPrettyPrinter
trait NoUnicodeEscCompactPrinter extends CompactPrinter with NoUnicodeEscJsonPrinter
object NoUnicodeEscCompactPrinter extends NoUnicodeEscCompactPrinter
然后,你可以这样做:
val json: JsValue = ...
val jsonString: String = NoUnicodeEscPrettyPrinter( json )
jsonString
将包含在美丽的打印格式,没有任何unicde转义的JSON文档。
这个问题出现在喷雾JSON 1.3.2予以纠正: https://github.com/spray/spray-json/issues/46
我跑进使用阿卡HTTP 1.0,这取决于1.3.1阿拉伯字符类似的问题。 通过升级到1.3.2,我的问题就解决了。