spray-json JsString 对字符串值的引用
Posted
技术标签:
【中文标题】spray-json JsString 对字符串值的引用【英文标题】:spray-json JsString quotes on string values 【发布时间】:2013-12-24 00:33:54 【问题描述】:我正在使用 json-spray。似乎当我尝试打印已解析的 JsString 值时,它在字符串上包含了以书本结尾的引号。
val x1 = """ "key1": "value1", "key2": 4 """
println(x1.asJson)
println(x1.asJson.convertTo[Map[String, JsValue]])
哪些输出:
"key1":"value1","key2":4
Map(key1 -> "value1", key2 -> 4)
但这意味着 key1 的字符串值实际上被引用了,因为 scala 显示没有引号的字符串。即val k = "value1"
输出:value1
不是"value1"
。也许我做错了什么,但我能想出的最好的方法是:
val m = x1.asJson.convertTo[Map[String, JsValue]]
val z = m.map(
case(x,y) =>
val ny = y.toString( x => x match
case v: JsString =>
v.toString().tail.init
case v =>
v.toString()
)
(x,ny)
)
println(z)
输出正确显示的字符串:
Map(key1 -> value1, key2 -> 4)
但此解决方案不适用于递归嵌套的 JSON。有更好的解决方法吗?
【问题讨论】:
没关系 - 我将使用 lift-json。 【参考方案1】:我遇到了完全相同的问题。挖掘源代码,他们使用的 compactPrint 看起来不错。我不知道它在什么时候用引号括起来
【讨论】:
【参考方案2】:试试这个:
import spray.json._
import DefaultJsonProtocol._
val jsString = new JsString("hello")
val string = jsString.convertTo[String]
【讨论】:
【参考方案3】:在新版本中,有一点不同:
libraryDependencies ++= "io.spray" % "spray-json_2.12" % "1.3.3"
import spray.json.DefaultJsonProtocol._
import spray.json._
object SprayJson extends ExampleBase
private def jsonValue(): Map[String, String] =
val x1 = """ "key1": "value1", "key2": 4 """
val json = x1.parseJson
println(json.prettyPrint)
json.convertTo[Map[String, JsValue]].map(v =>
(v._1, v._2 match
case s: JsString => s.value
case o => o.toString()
))
override def runAll(): Unit =
println(jsonValue())
输出:
"key1": "value1",
"key2": 4
Map(key1 -> value1, key2 -> 4)
【讨论】:
以上是关于spray-json JsString 对字符串值的引用的主要内容,如果未能解决你的问题,请参考以下文章