2013-07-15 2 views
3

두 객체의 Json 배열 인 문자열이 있습니다.Play API를 사용하여 JSON 배열을 비 직렬화하는 방법

> val ss = """[ {"key1" :"value1"}, {"key2":"value2"}]""" 

Play Json 라이브러리를 사용하여이를 역 직렬화하고 키 값에서 개체에 대한 맵을 만들고 싶습니다.

def deserializeJsonArray(ss:String):Map[String, JsValue] = ??? 
// Returns Map("value1" -> {"key1" :"value1"}, "value2" -> {"key2" :"value2"}) 

deserializeJsonArray 기능을 어떻게 작성합니까? 이것은 쉽지는 것처럼 보이지만, Play 설명서 또는 REPL에서 알아낼 수 없습니다.

답변

2

조금 녹슬어 져서 용서해주세요. 아마도 또 하나의 오버 플라워가 여기에 와서 나를 위해 청소할 수 있습니다.

이 솔루션은 JSON이 객체의 배열이고 각 객체가 정확히 하나의 키 - 값 쌍을 포함한다고 가정합니다. 구문 분석 된 JSON 문자열의 유효성을 검사하기 위해 오류 처리 및/또는 패턴 일치 기능을 사용하는 것이 좋습니다.

def deserializeJsonArray(ss: String): Map[String, JsValue] = { 

    val jsObjectSeq: Seq[JsObject] = Json.parse(ss).as[Seq[JsObject]] 

    val jsValueSeq: Seq[JsValue] = Json.parse(ss).as[Seq[JsValue]] 

    val keys: Seq[String] = jsObjectSeq.map(json => json.keys.head) 

    (keys zip jsValueSeq).toMap 
} 
관련 문제