如何在 `JsObject.toString()` 中禁用 Scala Play json 的反斜杠转义?

How can I disable Scala Play json's backslash escape in `JsObject.toString()`?

我找不到在 Play json 中将单个反斜杠打印为单个反斜杠的方法。这有可能吗?

scala> val k = """abc\edf"""
val k: String = abc\edf

scala> JsString(k)
val res80: play.api.libs.json.JsString = "abc\edf"

scala> JsString(k).toString()
val res81: String = "abc\edf"     // <--- additional "\" appears

scala> JsString(k).as[String]
val res82: String = abc\edf        // <--- this is the string that I need

scala> Json.stringify(JsString(k))
val res86: String = "abc\edf"

scala> Json.asciiStringify(JsString(k))
val res90: String = "abc\edf"

scala> Json.prettyPrint(JsString(k))
val res92: String = "abc\edf"

通常这会很好,因为我可以使用 as[String]。但是如果这个值在对象内,我就不能使用 as[String].

scala> JsObject(Seq("abc" -> JsObject(Seq("edf" -> JsString("""11122"""))))).toString()
val res99: String = {"abc":{"edf":"111\2222"}}    // <-- I have no ideea how I can print single back slash here

我想将 JsObject 转换为不带反斜杠转义的字符串,有没有办法做到这一点?

"abc\edf" 无效 JSON,根据 JSON 规范: https://www.json.org/json-en.html

\后面只能跟"\/bfn , r, t, 或 u+4 个代表 Unicode 代码点的十六进制数字。

Play Framework 不允许您输出格式错误的 JSON.

更具体地说,单个 \ 必须 在 JSON 到 \ 中转义。但是,如果您 parse 将 JSON 返回到 Scala,它将返回 \

val in = """abc\edf"""
val out = Json.parse(Json.stringify(JsString(in))).as[String]

out 应该是这样 abc\edf.

要从对象中提取特定的 属性,请使用 Play 的 JSON traversal mechanism

scala> val obj = JsObject(Seq("abc" -> JsObject(Seq("edf" -> JsString("""11122""")))))
val obj: play.api.libs.json.JsObject = {"abc":{"edf":"111\2222"}}

scala> (obj \ "abc" \ "edf").as[String]
val res0: String = 11122