[英]Get data from json in Scala
我正在嘗試在Scala中復制此Python代碼:
import json
def test_json():
parsed = json.loads("""[{"UserName":"user1","Tags":"one, two, three"},{"UserName":"user2","Tags":"one, two, three"}]""")
tags = parsed[0]["Tags"].split(", ")
print(tags)
test_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
?
這不是使用原始scala JSON util解析JSON的好方法,它不是類型安全的 。 也許您可以使用JSON4s或其他庫。
有一種方法可以通過使用scala 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
說明:
Option[Any]
)轉換為類型: Option[List[Map[String, String]]]
首先,默認的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")
tags
是Product with java.io.Serializable
但它也是List[String]
的實例
scala> tags.isInstanceOf[Seq[String]]
res35: Boolean = true
如果您可以自由選擇庫,我可以推薦scala 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.