2017-06-14 192 views
0

我試圖複製在斯卡拉這個Python代碼獲取從JSON數據在斯卡拉

import scala.util.parsing.json._ 

def testSix: Seq[String] = { 
    val parsed = JSON.parseFull("""[{"UserName":"user1","Tags":"one, two, three"},{"UserName":"user2","Tags":"one, two, three"}]""") 
    parsed.map(_ match { 
     case head :: tail => head 
     case _ => Option.empty 
    }).map(_ match { 
     case m: Map[String, String] => m("Tags").split(", ") 
     case _ => Option.empty 
    }) 
} 

我怎樣才能在json的第一個條目中獲取Tags

+0

您使用哪個庫來解析JSON? –

+0

@YuvalItzchakov更新。 – dangonfast

回答

1

它使用生JSON階UTIL解析JSON沒有一個很好的方法,它不是類型安全。也許你可以JSON4s或其他庫。

而且有一種方法,通過使用來實現這一斯卡拉UTIL

def testSix: Seq[String] = { 
    val parsed = JSON.parseFull("""[{"UserName":"user1","Tags":"one, two, three"},{"UserName":"user2","Tags":"one, two, three"}]""") 
    val typedResult: Option[List[Map[String, String]]] = parsed.map { 
     case a: List[_] => { 
     a.map { 
      case t: Map[String, String] => t 
     } 
     } 
    } 
    typedResult.map(_.flatMap(_.get("Tags")).toSeq).getOrElse(Seq()) 
    } 
    testSix.head 

說明:

  1. 解析JSON首先
  2. 嘗試轉換的解析結果(類型:Option[Any])到類型:Option[List[Map[String, String]]]
+0

謝謝,關閉,返回'列表(一,二,三,一,二,三)',但我需要'列表(一,二,三)' – dangonfast

+0

'testSix.head.split(「,\\ s +」 ).toList' – chengpohi

0

所有默認scala.util.parsing.json._庫可能在這種情況下是醜陋的。首先,還是嘗試一些如下

scala> val terriblyTraversedProperty = parsed.map(_ match { case head :: tail => head case _ => Option.empty }).map(_ match { case firstUser: Map[String, String] => firstUser("Tags") case _ => Option.empty }) 
terriblyTraversedProperty: Option[java.io.Serializable] = Some(one, two, three) 

要拆分是Option[String]的財產,

scala> val tags = terriblyTraversedProperty.map(_ match { case tagString: String => tagString.split(",").toList case _ => Option.empty[List[String]]}).get 
tags: Product with java.io.Serializable = List(one, " two", " three") 

tagsProduct with java.io.Serializable但也List[String]

scala> tags.isInstanceOf[Seq[String]] 
res35: Boolean = true 

我可以推薦斯卡拉json4s庫,如果你有自由選擇庫,

添加json4s到build.sbt,

libraryDependencies += "org.json4s" % "json4s-native_2.11" % "3.5.2" 

例如,

scala> import org.json4s._ 
import org.json4s._ 

scala> import org.json4s.native.JsonMethods._ 
import org.json4s.native.JsonMethods._ 

scala> val parsed = parse("""[{"UserName":"user1","Tags":"one, two, three"},{"UserName":"user2","Tags":"one, two, three"}]""") 
parsed: org.json4s.JValue = JArray(List(JObject(List((UserName,JString(user1)), (Tags,JString(one, two, three)))), JObject(List((UserName,JString(user2)), (Tags,JString(one, two, three)))))) 

從第一獲得屬性元件

scala> parsed.values.asInstanceOf[List[Map[String, String]]](0)("Tags") 
res13: String = one, two, three 
+0

謝謝。 「一些(一,二,三)」中的某些人是什麼在殺我。我想'Seq [String]'。不幸的是我無法改變圖書館。 – dangonfast

+0

好吧,只要你看到'Some',做'.map' :) – prayagupd

+0

已經嘗試過以幾種方式映射Some,但沒有運氣...... – dangonfast