파싱 된 (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
단점을에 중첩 된 필드에 게터를 정의 할 수 있습니다
감사합니다. 이것은 문제의 절반을 해결하지만 여전히 나는 '물건'을 만들어야합니다. 이상적으로 나는 그것을 피할 것입니다. – ohruunuruus