2016-09-14 192 views
0

映射我有一個JSON字符串,說:轉換JSON字符串在斯卡拉

val json = JSONObject(Map("a" -> 1)).toString() 

我想這個JSON轉換再次映射。我想:

val map = json.toMap[String, Int] 

這給了我下面的錯誤:

Error:(46, 25) Cannot prove that Char <:< (String, Int). 
val map = json.toMap[String, Int] 
        ^
Error:(46, 25) not enough arguments for method toMap: (implicit ev: <:<[Char,(String, Int)])scala.collection.immutable.Map[String,Int]. 
Unspecified value parameter ev. 
val map = json.toMap[String, Int] 
        ^

什麼是這樣做的正確方法是什麼?

回答

0

使用play-json可以轉換Json到地圖使用validate。驗證返回JsResult可能是JsSuccess(data,path)JsError(errors)。模式匹配從中獲取地圖。

如果您使用的是sbt project,則將play-json依賴項添加到您的項目中。

build.sbt

libraryDependencies ++= Seq("com.typesafe.play" %% "play-json" % "2.54.") 

斯卡拉REPL

scala> import play.api.libs.json._ 
import play.api.libs.json._ 

scala> val map = Map("java" -> 1, "scala" -> 2) 
map: scala.collection.immutable.Map[String,Int] = Map(java -> 1, scala -> 2) 

scala> Json.toJson(map).validate[Map[String, Int]] 
res3: play.api.libs.json.JsResult[Map[String,Int]] = JsSuccess(Map(java -> 1, scala -> 2),) 

scala> val result = Json.toJson(map).validate[Map[String, Int]] 
result: play.api.libs.json.JsResult[Map[String,Int]] = JsSuccess(Map(java -> 1, scala -> 2),) 

scala> result match { case JsSuccess(data, _) => data case JsError(errors) => Unit} 
res4: Object = Map(java -> 1, scala -> 2) 
0

如果這是一個一次性的,那麼你可以做這樣的事情:

val json = JSONObject(Map("a" -> 1)).toString() //> json : String = {"a" : 1} 

    val map = json.substring(1, json.length - 1).split(":").map(_.trim) match { 
    case Array(s: String, i: String) => Map(s -> i.toInt) 
    }            //> map : scala.collection.immutable.Map[String,Int] = Map("a" -> 1) 

然而,如果你正在做更多的事情Json然後你可能想探索一下庫的使用,因爲我認爲標準庫中對Json的支持是有限的。請參閱this post瞭解可用庫的概覽。

0
val map = json.toMap.asInstanceOf[Map[String, Int]]