2013-12-06 6 views
6

Я использую json-spray. Похоже, что когда я пытаюсь напечатать синтаксическое значение JsString, оно включает в себя кавычки в конце строки.spray-json 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) 

Но это означает, что строковое значение ключом1 фактически цитировал, так как отображает строки 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

Ничего. Я пойду с лифтом. –

ответ

0

Я столкнулся с такой же проблемой. Копаясь в исходном коде, они используют compactPrint, который кажется прекрасным. Я не в какой момент она принести завернутые в кавычки

10

Попробуйте это:

import spray.json._ 
import DefaultJsonProtocol._ 
val jsString = new JsString("hello") 
val string = jsString.convertTo[String] 
1

В новой версии есть небольшая разница:

libraryDependencies ++ = «io.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)