8

我正在使用 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。有更好的解决方法吗?

4

3 回答 3

16

尝试这个:

import spray.json._
import DefaultJsonProtocol._
val jsString = new JsString("hello")
val string = jsString.convertTo[String]
于 2014-05-23T09:55:15.767 回答
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)

于 2017-05-04T12:02:25.477 回答
0

我遇到了完全相同的问题。挖掘源代码,他们使用的 compactPrint 看起来不错。我不知道它在什么时候用引号括起来

于 2014-03-14T01:45:37.080 回答