Как я могу отключить функцию Scala для воспроизведения обратной косой черты json в `JSObject.toString ()»?

#scala #play-json

Вопрос:

Я не могу найти способ напечатать одну обратную косую черту как одну обратную косую черту в Play json. Возможно ли такое?

 scala> val k = """abcedf"""
val k: String = abcedf

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 = abcedf        // <--- 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("""1112222"""))))).toString()
val res99: String = {"abc":{"edf":"111\2222"}}    // <-- I have no ideea how I can print single back slash here
 

Я хочу преобразовать JSObject в строку без экранирования обратной косой черты, есть ли способ сделать это?

Ответ №1:

"abcedf" является недопустимым JSON, в соответствии со спецификациями JSON: https://www.json.org/json-en.html

может сопровождаться только " , / , b , f , n , r , t , или u 4 шестнадцатеричными цифрами , представляющими кодовую точку Юникода.

введите описание изображения здесь

Платформа Play просто не позволяет вам выводить неправильный JSON.

Более конкретно, один должен быть экранирован в JSON to \ . Но если вы parse вернете JSON обратно в Scala, он вернется без эскапады .

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

out должно выглядеть вот так abcedf .

Чтобы извлечь определенное свойство из объекта, используйте механизм обхода JSON Play.

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

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