我正在使用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。有更好的解决方法吗?
答案 0 :(得分:12)
试试这个:
import spray.json._
import DefaultJsonProtocol._
val jsString = new JsString("hello")
val string = jsString.convertTo[String]
答案 1 :(得分:1)
在新版本中,有一点不同:
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)

答案 2 :(得分:0)
我遇到了完全相同的问题。通过源代码挖掘,他们使用的是compactPrint,看起来很好。我不知道它带有什么引号包裹着