2010-05-22 3 views
3

예를 들어이 질문에 대해 설명하겠습니다. 나는 같은 JSON이있는 경우 다음Lift-JSON을 사용하여 동적 값 구문 분석

{ "PERSON1": { "이름": "이름 하나", "주소": { "거리": "일부 거리", "도시" "일부 도시"}},
"person2": { "이름": "이름 2", "주소": { "거리": "일부 기타 스트리트", "도시": "일부 다른 도시"} }}

내가 공동

[사람의 수에 제한이 없습니다, 입력 JSON 더 많은 사람을 가질 수 있습니다]

경우 클래스 주소 (: 사람이 (해상도) .extract [T]

여기 관련된 경우 클래스가

VAR 명 = 해석을 수행하여, 목적에 ULD이 JSON 추출 거리 : 문자열, 도시 : 문자열)
사례 클래스 사람 (이름 : 문자열, 주소 : 주소, 자식 : 목록 [자식])
경우 클래스 사람 (PERSON1 : 사람, PERSON2 : 사람)

질문 : 위의 시나리오는 완벽하게 잘 작동합니다. 그러나 키/값 쌍에서 키가 동적이어야합니다. 따라서 제공된 JSON 예제에서 person1person2은 무엇이든 될 수 있으므로 동적으로 읽어야합니다. Person 클래스가 동적 인 특성을 설명 할 수있는 최선의 구조는 무엇입니까? 그 구문 분석

답변

7

한 가지 방법은 루트 JSON 객체의 자식 요소를 매핑하는 것입니다

scala> parse(res).children.map(_.extract[Person]) 
res3: List[Person] = List(Person(Name One,Address(Some Street,Some City)), Person(Name Two,Address(Some Other Street,Some Other City))) 

또는 같은 당신은 필드 이름을 보존해야하는 경우

:

scala> Map() ++ parse(res).children.map { case f: JField => (f.name, f.extract[Person]) } 
res4: scala.collection.immutable.Map[String,Person] = Map(person1 -> Person(Name One,Address(Some Street,Some City)), person2 -> Person(Name Two,Address(Some Other Street,Some Other City))) 

주의 우리는 2.8 기능을 사용하기 시작할 때 직접 방법을 따라야합니다 :

parse(res).extract[Map[String, Person]] 
+1

위대한! 매력처럼 작동했습니다. BTW 당신은 ​​lift-json으로 훌륭한 일을 해냈습니다. 지도와 목록을 루트 수준에서 사용하고 싶습니다. –

+0

감사합니다 Surya! 나는 열심히 2.8로 완전히 전환되기를 기다리고있다. Lift 2.0이 출시 된 후 2.8 기능을 사용하기 시작합니다 (첫 번째 출시 후보는 곧 출시 될 예정입니다). – Joni

+0

안녕하세요 Joni, 이제 lift-json에서 루트 맵 객체를 사용합니까? Scala 2.8.1에서 2.2 리프트를 사용하고 있으며 해당 기능이없는 것 같습니다. –