#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