簡體   English   中英

從Scala中的json獲取數據

[英]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

說明:

  1. 首先解析json
  2. 嘗試將解析的結果 (類型: 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")

tagsProduct 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM