Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.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
将任何JSON解析为JValue,而不指定case类_Json_Scala_Json4s - Fatal编程技术网

将任何JSON解析为JValue,而不指定case类

将任何JSON解析为JValue,而不指定case类,json,scala,json4s,Json,Scala,Json4s,我试着更好地解释 我正在从json字符串解析json文件,例如: [ { "album": "The White Stripes", "year": 1999, "US_peak_chart_post": 55 }, { "album": "De Stijl", "year": 2000, "US_peak_chart_post": 66 } ] 到[相册]序列: import org.json4s._ import org.json4s.jacks

我试着更好地解释

我正在从json字符串解析json文件,例如:

[
 {
   "album": "The White Stripes",
   "year": 1999,
   "US_peak_chart_post": 55
 },
 {
   "album": "De Stijl",
   "year": 2000,
   "US_peak_chart_post": 66
 }
]
到[相册]序列:

import org.json4s._
import org.json4s.jackson.JsonMethods._
import scala.util.{Failure, Success, Try}

object AlbumsHandler{
    implicit val formats = DefaultFormats

    def extractAlbumsFromJsonFile(json: String): Seq[Album] = {

      val jValues: Try[JValue] = Try(parse(json))
      val albums: Seq[Album] = jValues.map(
        value => value.extract[Seq[Album]]
      ).getOrElse(Seq())

      albums
    }
}
通过提供
相册
案例类
作为“蓝图”:

有没有一种方法可以做我已经在做的事情,从我的JSON中自动提取一个
Seq[Album]
,而不必指定一个
case类作为蓝图


非常感谢

好吧,任何JSON对象都可以提取到
映射中
,任何JSON数组都可以提取到
序列中。但是,使用
Map[String,Any]
并不太方便,而且没有比指定case类来提取类型安全结构更简单的方法了

import org.json4s._
import org.json4s.jackson.JsonMethods._

implicit val formats = DefaultFormats

val json = """[
             | {
             |   "album": "The White Stripes",
             |   "year": 1999,
             |   "US_peak_chart_post": 55
             | },
             | {
             |   "album": "De Stijl",
             |   "year": 2000,
             |   "US_peak_chart_post": 66
             | }
             |]""".stripMargin

val map = parse(json).extract[Seq[Map[String, Any]]]
// map: Seq[Map[String,Any]] = List(Map(album -> The White Stripes, year -> 1999, US_peak_chart_post -> 55), Map(album -> De Stijl, year -> 2000, US_peak_chart_post -> 66))

谢谢以及如何获得唱片类或任何其他类?不获得
Album
类作为结果不是您想要实现的吗?如果您想要实体,那么您的case类版本是正确的;但我的问题是,我希望有尽可能少的耦合代码。因此,我希望有一个方法能够提取json,同时能够重用以获取其他类以及Album的对象。。。您需要手动定义
Album
的构造函数,以获取
Map
。例如,如果您有两个子项目,它们都需要引用相册,但不需要相互依赖,只需将模型(和json解析器)提取到另一个“核心”或“公共”项目中,并使您的子项目依赖于它即可。
import org.json4s._
import org.json4s.jackson.JsonMethods._

implicit val formats = DefaultFormats

val json = """[
             | {
             |   "album": "The White Stripes",
             |   "year": 1999,
             |   "US_peak_chart_post": 55
             | },
             | {
             |   "album": "De Stijl",
             |   "year": 2000,
             |   "US_peak_chart_post": 66
             | }
             |]""".stripMargin

val map = parse(json).extract[Seq[Map[String, Any]]]
// map: Seq[Map[String,Any]] = List(Map(album -> The White Stripes, year -> 1999, US_peak_chart_post -> 55), Map(album -> De Stijl, year -> 2000, US_peak_chart_post -> 66))