2016-06-14 3 views
0

파싱 된 (json4s를 통해) json 문자열 예를 들어. 다음 org.json4s.JValue :스칼라의 json4s를 사용하여 중첩 된 json의 필드 추출

case class Data(important_field: String) 
val extracted: Data = data.extract[Data] 

extracted: Data = Data(info)을 제공 :

val data: JValue = parse("""{ 
    "important_field" : "info", 
    "some_junk" : 12345, 
    "interesting_stuff" : { 
     "pi" : 3.14, 
     "e" : 2.72 
    } 
}""") 

내가 선택적으로 내가 필요한 정보를 추출 할 수 있습니다. 또한, 나는 다른 경우 클래스와 중첩 된 JSON 객체에서 정보를 추출 할 수 있습니다 : 나에게 extracted: Data = Data(info,Stuff(3.14))을 제공하는

case class Stuff(pi: Double) 
case class Data(important_field: String, interesting_stuff: Stuff) 
val extracted: Data = data.extract[Data] 

. 내가 중첩 된 객체의 필드에 액세스하려면하지만 지금, 내가, 내 내부 케이스 클래스는 Stuff를 사용해야합니다 : 중첩을 드롭

val pi: Double = extracted.interesting_stuff.pi 

내가 원하는 것, 그래서 Data는 평평하다, 즉, 내가 원하는 중첩 된 클래스가 고통없는 사용이 사소한 경우

val pi: Double = extracted.pi 

, 그러나 둥지의 여러 수준이있을 때 내 개체의 해당 중첩을 유지해야 할 실망이 같은 (원래) 중첩 된 필드에 액세스 . 이것을 다루기위한 전형적인 접근법이 있습니까? 멋진 스칼라 트릭?

당신이 당신의 외부 케이스 클래스

case class Data(important_field: String, interesting_stuff: Stuff) { 
    def pi: Double = interesting_stuff.pi 
} 

// now you'll be able to write 
val pi: Double = extracted.pi 

단점을에 중첩 된 필드에 게터를 정의 할 수 있습니다

답변

1

은 쉽게

+0

감사합니다. 이것은 문제의 절반을 해결하지만 여전히 나는 '물건'을 만들어야합니다. 이상적으로 나는 그것을 피할 것입니다. – ohruunuruus

2

중첩에 액세스 할 중첩 된 각 필드에 대해 손으로이 작업을 수행해야한다는 것입니다 JSON 구조는 자신의 경우 클래스에 맵핑 JSON 컨텐츠 전에 변형 될 수있다 : 하나는 중첩 된 경우 클래스를 정의 할 필요가 없습니다

object NestedJsonSpec { 
    case class Data(important_field: String, pi: Double) 

    implicit val formats = DefaultFormats // Brings in default date formats etc. 

    def extract(source: JsonInput) : Data = { 
    parse(source).transformField({ 
     case JField("interesting_stuff", jv) => ("pi", jv \ "pi") 
    }).extract[Data] 
    } 
} 

결과. 코드에 사용

종속성했다 :

여기
scalaVersion := "2.11.8" 

libraryDependencies ++= { 
    Seq(
    "org.json4s" %% "json4s-ext" % "3.5.0", 
    "org.json4s" %% "json4s-native" % "3.5.0", 
    "org.scalatest" %% "scalatest" % "2.2.6" % Test 
) 
} 

unit test와 관련 GitHub의 프로젝트입니다.