2011-09-06 3 views
5

를 사용하여 스칼라에서 JSON에서 내가 직렬화 및 JSON에서 역 직렬화 할 수 있도록하고 싶습니다 :직렬화 목록 [모든]에/나는 경우 클래스를 가지고 잭슨

case class Foo(values: List[Any]) 

를 예를 들면,

Foo(List(new DateTime)) 

이 시나리오에서 DateTime은 long으로 serialize되고 따라서 dateTime이 아닌 Long으로 serialize됩니다.

{"values":[1315343106920]} 

제안 : 이것처럼

? 클래스의 이름 (예 : DateTime)을 직렬화해야하고 deserialization을 확인해야합니다. 값 목록에 넣을 수있는 유형 목록은 유한/소형입니다. 나는 무력 솔루션 것 같아 무엇에 의지 한

{"values":[{"DateTime":1315343106920}]} 

답변

0

잭슨, 예를 들어,와 수동 직렬화를 할 단지로 : 아마도이 같은

이 도와 줄 경우

def serializeNode(foo: Foo, mapper: ObjectMapper): JsonNode = { 
    val n = mapper.createObjectNode() 

    val valuesNode = mapper.createArrayNode() 
    n.put("values", valuesNode) 
    foo.values.foreach { value => 
     val nd = mapper.createObjectNode 

     value match { 
     case intValue: Int => nd.put("int", intValue) 
     case decimalValue: BigDecimal => nd.put("decimal", decimalValue.bigDecimal) 
     case booleanValue: Boolean => nd.put("boolean", booleanValue) 
     case strValue: String => nd.put("string", strValue) 
     case dtValue: DateTime => nd.put("datetime", _dtFmt.print(dtValue))   
     case _ => sys.error("Unexpected value type: " + value) 
     } 
     valuesNode.add(nd) 
    } 
    n 
    } 

    def serialize(foo: Foo): String = { 
    val out = new StringWriter 
    val generator = new JsonFactory().createJsonGenerator(out) 
    val mapper = new ObjectMapper 
    generator.setCodec(mapper) 

    generator.writeTree(serializeNode(foo, mapper))  
    out.toString 
    } 
+1

확실하지,하지만 Jerkson [https://github.com/codahale/jerkson] 잭슨의 스칼라 고유의 확장이며, 일반 잭슨보다이 사건을 처리 할 수 ​​있는가? 스칼라 전용 사용법을 향상시키는 것을 목표로하는 Jackson 확장 모듈 [https://github.com/FasterXML/jackson-module-scala]도 있습니다. – StaxMan

관련 문제