2013-10-26 3 views
6

Play Framework 2.1.3에서 Ajax POST 요청을 처리하려고합니다. 포스트 데이터는 JSON 객체이며, 같은 트리 구조가 : 나는 둥지 '어린이'임의 깊은 싶습니다Scala Play Framework에서 JSON 트리 구조 읽기

{ id: "a", name: "myname", kids : [{ id: "a1", name : "kid1", kids: []}, {id: "a2", name: "kid2", kids: [{id: "aa1", name :"grandkid", kids: []}]}] 

합니다. 내가 생각하고있는 것이다 클래스는 (내가 실현 recursiveness이 문제가 될 수 있습니다) 이렇게 있습니다 :

case class Person { 
    id: String, 
    name: String, 
    kids: Array[Person] 
} 

내가 생각하고있는 것 형식 :

implicit val personFormat:Format[Person] = Json.format[Person] 

재생 내 형식에 오류를 던지고 그 나는 썼다 :

유형 불일치; found : controllers.Resources.Person required : Array [controllers.Resources.Person]

Play에 Tree 구조가 있다는 것을 알고 있습니다. JSON 읽는 방법에 관한 예제/문서를 찾을 수 없습니다.

어떤 도움

매우 감사

답변

9

당신은 뭔가를 재귀 발가 필요합니다

implicit val jsonReads: Reads[Person] = ((__ \ "id").read[String] and (__ \ "name").read[String] and (__ \ "kids").read[Seq[Person]])(apply _) 

더 일반적인 그리고 당신이 다운에 영향을주지 않고 구현을 변경할 수 있기 때문에 서열로 배열에서 컬렉션 형식을 변경했습니다 (코드)

여기에는 here에 설명 된 구문이 사용됩니다.

+0

고마워요 로빈, 난 당신의 답변을 통합하려고하고 '찾을 수 없습니다 : 가치 적용'컴파일 오류가 발생합니다. 기본 무언가를 놓치고 있습니까? 그리고 Person 클래스의 'kids'는 대답을 위해 'Seq [Person]'이어야합니까? 감사! – Joost

+0

오, 당신이 동반자 개체에서 선언하지 않는다고 생각합니다. 그러므로'apply'를'Person'으로 변경하십시오. 당신은'Array'로 변경할 수 있지만, 만약 Play가 자동으로'Array's를 읽을 수 있을지 확신하지 못합니다; 그래서'Person'에서 사용 된 콜렉션 타입을'Array'에서'Seq'로 바꾸라고 제안한 것입니다. 미안하지만 분명하지 않다. –

2

나는 당신의 사람의 경우 클래스 대신에 배열의이 작업은 JsArray 또는 배열 [문자열]을 사용한다 [사람]을 볼 수있는 유일한 방법은 감사합니다. JSON 매크로 Inception은 암시 적 JSON 읽기 + 쓰기 코드가 이미 존재하는 객체에 대한 프리미티브 및 목록,지도 및 배열에 대한 읽기 + 쓰기 코드 만 생성 할 수 있습니다. 본질적으로 자신을 참조하는 사례 클래스를 가질 수 없습니다.

package models 

import play.api.libs.json._ 

case class Person(
    id : String, 
    name : String, 
    kids : JsArray 
) 

object Person extends ((String,String,JsArray) => Person) { 

    implicit val jsonFormat = Json.format[Person] 

} 
+1

그래도 좋은 디자인은 아닙니다. 와이어 표현을 드러내고있다. XML을 받아들이기로 결정한다면 어떨까요? –

+1

질문은 JSON 구조를 읽는 방법 이었지만 XML은 부적절합니다. –

+1

미래의 디자인 결정에 대해 이야기하고 있습니다. 하지만 상관없이, 케이스 클래스에 와이어 표현을 드러내지 않아야합니다. 클라이언트 코드가 걱정할 필요가없는 비 직렬화에 대해 걱정해야합니다. –

관련 문제