Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用scala将json文件转换为列表_Scala - Fatal编程技术网

如何使用scala将json文件转换为列表

如何使用scala将json文件转换为列表,scala,Scala,我有以下json输入 sample.json [{"level": 1, "firstFile": "one", "secondFile": "first"}, {"level": 1, "firstFile": "two", "secondFile": "sec"}, {"level": 2, "firstFile": "three", "secondFile": "third"}] 我希望我的结果应该是: val first= List(List("one","two"),List("

我有以下json输入 sample.json

[{"level": 1, "firstFile": "one", "secondFile": "first"},
 {"level": 1, "firstFile": "two", "secondFile": "sec"},
 {"level": 2, "firstFile": "three", "secondFile": "third"}]
我希望我的结果应该是:

val first= List(List("one","two"),List("three"))
val second= List(List("first","sec"),List("third"))
build.sbt:

name := "Test"
version := "1.0"
scalaVersion := "2.11.0"

libraryDependencies ++= Seq("org.apache.spark" % "spark-sql_2.11" % "2.0.0" % "provided")
libraryDependencies += "com.typesafe" % "config" % "1.2.0"
libraryDependencies ++= Seq("org.slf4j" % "slf4j-api" % "1.7.5",
                            "org.clapper" %% "grizzled-slf4j" % "1.3.1")
libraryDependencies += "ch.qos.logback" % "logback-core" % "1.2.3"
libraryDependencies += "ch.qos.logback" % "logback-classic" % "1.2.3" % "test"
libraryDependencies += "com.databricks" % "spark-avro_2.11" % "4.0.0"
libraryDependencies += "io.circe" %% "circe-config" % "0.4.1"               
retrieveManaged := true

通常使用Jackson或Circe之类的库将JSON转换为case类

val json = """[{"level": 1, "firstFile": "one", "secondFile": "first"},
             | {"level": 1, "firstFile": "one", "secondFile": "first"},
             | {"level": 2, "firstFile": "two", "secondFile": "sec"},
             | {"level": 2, "firstFile": "two", "secondFile": "sec"}]""".stripMargin

case class My2FileThing(level: Int, firstFile: String, secondFile: String)

val parsed: List[My2FileThing] = {
  // TODO parse json using some library; there are many available

  List(
    My2FileThing(1, "one", "first"),
    My2FileThing(1, "one", "first"),
    My2FileThing(2, "two", "sec"),
    My2FileThing(2, "two", "sec")
  )
}
您提供的json是一个一维
列表
,包含上述四项

要将这些数据转换为您要求的两个列表,我想您可以这样做。你没有告诉我们你转变背后的逻辑

val firstLineChandraWants: List[List[String]] =
  parsed.map(_.firstFile).groupBy(identity).values.toList
val secondLineChandraWants: List[List[String]] =
  parsed.map(_.secondFile).groupBy(identity).values.toList

使用一些库将Json字符串转换为Scala对象/类型

有关更多信息:

使用升降机的示例:

import net.liftweb.json._
implicit val formats = DefaultFormats // Brings in default date formats etc.
val json = """
[{"level": 1, "firstFile": "one", "secondFile": "first"},
 {"level": 1, "firstFile": "two", "secondFile": "sec"},
 {"level": 2, "firstFile": "three", "secondFile": "third"}]
"""
case class ListSubType(level: Int, firstFile: String, secondFile: String)

val parsed: List[ListSubType] =  parse(json).extract[List[ListSubType]]
val desired: List[List[String]] = parsed.map(a => List(a.firstFile, a.secondFile))

// will produce: List(List("one", "first"), List("two", "sec"), List("three", "third"))
我知道您在不同的变量中要求不同的元素(根列表),但使用索引或遍历列表比使用不同的变量要好。实际上,列表的长度是不确定的,所以如何将不同的项分配给不同的变量呢。 示例=>

/**
* Using index
*/
val first:Option[String] = desired.get(0) // will return Option[String]
val second:Option[String] = desired.get(1) // will return Option[String]

for (items <- desired) {
   println(items)
}
/**
*使用索引
*/
val first:Option[String]=所需。get(0)//将返回Option[String]
val second:Option[String]=所需。get(1)//将返回Option[String]

对于(项目),我在导入net.liftweb.json时收到错误。\uObject liftweb不是包net@Ravinder Payal的成员,谢谢您的回复。我添加了libraryDependencies+=“net.liftweb”%%“lift json”%%“2.4-M5”,但在运行sbt时收到错误。[错误](*:更新)sbt.ResolveException:未解析的依赖项:net.liftweb#lift-json_2.11;2.4-M5:未找到[error]无法创建Eclipse项目文件:[error][评估任务“ScalaOptions”时出错:错误,评估任务“externalDependencyClasspath”时出错:评估任务“update”时出错:评估任务“updateClassifiers”时出错:错误,评估任务“updateClassifiers”时出错:错误]。还有其他帮助吗?@Chandra将您的sbt文件作为问题编辑共享,您的构建中似乎没有映射任何中央存储库。sbtadded了buid.sbt文件。请提出建议。感谢您的回复。您可以帮助我如何解析JSON吗。有很多库可用于此操作。请参阅@Ravinder答案中的链接。通常,如果您是你需要解析Json,你正在编写一个web服务器,并使用一个web框架,大多数web框架都包含某种Json解析器,你最好使用它,而不是导入其他东西。看起来你已经导入了Circe库,这是一个很受欢迎的库-你可以在这里学习如何使用它;