2017-06-14 170 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