2013-06-06 1 views
2

변경할 수없는 내부 웹 서비스에서 인터넷 클라이언트로 보내는 네트워크 트래픽을 줄이기 위해 JSON 응답을 트리밍해야합니다.스칼라 플레이 프레임 워크 2.1에서 트랜스포머를 사용하여 JsArray를 자르는 방법

JSON 응답의 특정 하위 집합 만 추출하는 웹 서비스 "릴레이". 모든 것을 한 형식에서 다른 형식으로 JSON 변환되어 발생, 나는 플레이 프레임 워크 2.1의 새로운 JSON 변압기를 사용하는 것을 선호하기 때문에

(참조 : http://www.playframework.com/documentation/2.1.1/ScalaJsonTransformers를)

이 어려움을 높이기 위해 응답이 배열입니다 서로 다른 JSON 객체로 구성되며 각 객체에서 두 개의 필드 만 필요합니다.

[ 
    { 
    "keyA": "keep this value", 
    "keyB": [ {"value": "keep this value", "anotherValue": "keep this value" } ], 
    "keyC": "drop this value" 
    }, 
    { 
    "keyA": "keep this value", 
    "keyB": [ {"value": "keep this value", "anotherValue": "keep this value" } ], 
    "keyD": "drop this value", 
    "keyE": "drop this value" 
    }, 
    { 
    "keyA": "keep this value", 
    "keyB": [ {"value": "keep this value", "anotherValue": "keep this value" } ], 
    "extraRandomKeys": "drop this value", 
    "fieldsWhichMayNotAlwaysAppear: "drop this value" 
    } 
] 

로 :

[ 
    { 
    "keyA": "keep this value", 
    "keyB": [ {"value": "keep this value", "anotherValue": "keep this value" } ] 
    }, 
    { 
    "keyA": "keep this value", 
    "keyB": [ {"value": "keep this value", "anotherValue": "keep this value" } ] 
    }, 
    { 
    "keyA": "keep this value", 
    "keyB": [ {"value": "keep this value", "anotherValue": "keep this value" } ] 
    } 
] 

내가 사용했던 템플릿 방법은 다음과 같습니다

def relayWsResponse = Action { 
    request => 
    Async { 
     WS.url("http://internalhost/service") 
     .get() 
     .map(
     response => { 
      Ok(
      response.json.transform(
       ??? 
      ).get 
     ) 
     } 
    ) 
    } 
} 

답변

3
특정 더미 예를 들어

, 나는 다음과 같은 JSON 변환을 시도하고있다

효과가 있지만 최선의 선택이 아닐 수도 있습니다.

import play.api.libs.json._ 
import play.api.libs.json.Reads._ 
import play.api.libs.functional.syntax._ 

val transformer: Reads[JsArray] = of[JsArray].map{ 
    case JsArray(xs) => JsArray(xs.flatMap{ 
    case x: JsObject => Some(
     x.transform(
     (__ \ "keyA").json.pickBranch and (__ \ "keyB").json.pickBranch reduce 
    ).get 
    ) 
    }) 
}