spray-json JsString引用字符串值

时间:2013-12-06 15:26:51

标签: json scala spray-json

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

3 个答案:

答案 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,看起来很好。我不知道它带有什么引号包裹着