2016-10-09 4 views
0

으로 단일 값의 경우 클래스에 할당 :JSON 배열을 변환하고 다음 JSON 개체를 감안할 때 플레이 JSON

RealTimeAccesses(Map(1->2,3->4)) 

이 코드입니다 :

{realtime-accesses: [ 
    {realtime-access: { 
     level: 2 
     marketID: 1 
    }}, 
    {realtime-access: { 
     level: 4 
     marketID: 3 
    }} 
] 
} 

내가 다음과 같습니다 스칼라 객체를 원하는 점점 메신저에 기호를 해결할 수없는, 그러나이 작동하지 않습니다

case class RealTimeAccesses(markets: Map[Int, Int]) 
    object RealTimeAccesses { 
    implicit val realTimeAccessesFormatter: Format[RealTimeAccesses] = (
     (__ \ "realtime_accesses").format[List[Map[String, Map[String, Int]]]].map(
     _.iterator 
     .flatMap(_.values) 
     .map { v => v("marketID") -> v("level") } 
     .toMap).inmap(m => RealTimeAccesses(m), (m: RealTimeAccesses) => m.markets)) 
    } 

을 : 임 사용하려고.

내 질문은 :

    이 변환이 내가 원하는 방식으로 일을 할 수있는 방법을
  1. ?
  2. 사례 클래스 대신 type RealTimeAccess = Map[Int,Int]을 사용할 수 있습니까?
+0

물론 inmap은 해결할 수 없습니다. 스칼라 메서드가 아닙니다. "inmap"이 정확히 무엇을 기대합니까? 1. JSON을 구문 분석하거나 다시 작성해야합니까? 2. 아니요. 사용중인 라이브러리에 사례 클래스를 지정해야합니다. – jhn

답변

0

작동하지 않는 이유는 Format[A]에는 기능이 없습니다. mapA => B 기능으로 호출하면 Reads[B]이 아닌 Format[B]이 다시 나타납니다.

val format1: Format[List[Map[String, Map[String, Int]]]] = (__ \ "realtime_accesses").format[List[Map[String, Map[String, Int]]]] 

val format2: Reads[Map[Int, Int]] = format1.map(
    _.iterator 
    .flatMap(_.values) 
    .map { v => v("marketID") -> v("level") } 
    .toMap 
) 

그래서 즉시 .inmap를 호출하고 inmap의 내부에 필요한 모든 변환을 할 필요가있다.

(__ \ "realtime_accesses").format[List[Map[String, Map[String, Int]]]].inmap(
    m => { 
    val markets = m.flatMap(_.values) 
     .map { v => v("marketID") -> v("level") } 
     .toMap 
    RealTimeAccesses(markets) 
    }, 
    (m: RealTimeAccesses) => m.markets.map { 
    case (marketID, level) => 
     Map("realtime-access" -> 
     Map(
      "marketID" -> marketID, 
      "level" -> level 
     )) 
    }.toList 
) 
관련 문제