2016-06-06 1 views
2

더 잘 설명하려고합니다.사례 클래스를 지정하지 않고 JSON을 JValue로 구문 분석하십시오.

[ 
{ 
    "album": "The White Stripes", 
    "year": 1999, 
    "US_peak_chart_post": 55 
}, 
{ 
    "album": "De Stijl", 
    "year": 2000, 
    "US_peak_chart_post": 66 
} 
] 

Seq[Album] A와 :

나는 같은 JSON 문자열에서 JSON 파일을 구문 분석하고

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 
    } 
} 

는 "청사진"으로 Albumcase class을 제공 :

case class Album(album: String, year: Int, US_peak_chart_post: Int) 

내가하는 것과 같은 일을 할 수있는 방법이 있습니까? 내 JSON에서 Seq[Album]을 추출 할 준비가되었지만 자동으로 case class을 청사진으로 지정할 필요없이?

가 대단히

답변

2

음을 감사, 어떤 JSON 객체는 Map로 추출 할 수 있으며, 어떤 JSON 배열은 Seq로 추출 할 수 있습니다. 그러나 Map[String, Any]으로 작업하기에는 너무 편리하지 않으며, typesafe 구조를 추출하기 위해 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)) 
+0

감사합니다. 그 결과로 앨범 클래스를 얻는 방법, 또는 다른 클래스를 얻는 방법? –

+0

그 결과로 '앨범'클래스를 얻지 못했습니까? 엔티티를 원하면 케이스 클래스가있는 버전이 맞습니다. – Sergey

+0

예, 정확합니다. 하지만 제 문제는 가능한 한 적은 결합 코드를 갖고 싶습니다. 따라서 json을 추출 할 수있는 방법을 원하면서 동시에 다른 클래스뿐만 아니라 Album을위한 객체를 얻기 위해 재사용 할 수 있기를 바랍니다. –

관련 문제