2014-07-24 4 views
6

예제는 json4s readme https://github.com/json4s/json4s#serializing-non-supported-types에 제공된 예제에서 필드가 { "start": 0, "end": 0} 순서 인 경우에만 작동합니다. 시작 및 끝 필드가 바뀌면 일치 항목이 작동하지 않습니다. 어쨌든 JSON 필드 순서가 중요하지 않도록 아래의 대/소문자 일치를 작성합니까?정렬되지 않은 필드가있는 Json4s 사용자 지정 serializer

case JObject(JField("start", JInt(s)) :: JField("end", JInt(e)) :: Nil) 

답변

4

나는이 라이브러리를 사용하지 않은, 그래서 난이 올바른 접근 방식 인 경우 확실하지 않다 :

class IntervalSerializer extends CustomSerializer[Interval](format => (
    { 
    case x: JObject => 
     x.obj.sortBy { case (k,_) => k } match { 
     case JField("end", JInt(e)) :: JField("start", JInt(s)) :: Nil => 
      new Interval(start = s.longValue(), end = e.longValue()) 
     } 
    }, 
    { 
    case x: Interval => 
     JObject(JField("start", JInt(BigInt(x.startTime))) :: 
     JField("end", JInt(BigInt(x.endTime))) :: Nil) 
    } 
)) 
(I는 문서보고 몇 분을 소비 한 후이 함께했다)

아이디어는 사전 순으로 필드를 정렬 한 다음 Interval 클래스를 만드는 것입니다.

3

나는 다른 것을 가지고 있었지만, related issue으로 json4s에서 "추출"기능을 발견하게되었습니다. 주문 문제를 해결합니다.

case x: JObject => 
    Interval((x \ "start").extract[Int],(x \ "end").extract[Int]) 

더 복잡한 예제가 필요하면이 github ticket을 확인할 수 있습니다.