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 对字符串值的引用的主要内容,如果未能解决你的问题,请参考以下文章

spray-json

使用 Spray-json 解析简单数组

Spray-Json:如何解析 Json 数组?

spray-json:序列化一个通用特征

Spray-json 和列表编组

Scala,spray-json:通用枚举 json 格式