将任何JSON解析为JValue,而不指定case类
我试着更好地解释 我正在从json字符串解析json文件,例如:将任何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
[
{
"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))