2013-04-24 3 views
1

Поскольку Json4s поставляются с сериализацией карты только тогда, когда ключ является String, я пытаюсь написать свои собственные сериализаторы для конкретной карты с перечислением Java в качестве ключа.Написание пользовательского сериализатора для Json4s

class HistoricalRecordCustomSerializer extends CustomSerializer[Map[QuotedData,Double]](
    format => (
    { 
     case JArray(items) => 
     items.map{ 
        case JObject(JField(name,JDouble(value))::Nil) => (QuotedData.valueOf(name),value) 

       }.toMap 


    }, 
    { 
     case x: Map[QuotedData,Double] => 
     JArray(
      x.map(entry => 
        JObject(
        List(
         JField(entry._1.toString,JDouble(entry._2)) 
        ) 
       ) 
     ).toList 
     ) 
})) 

Прежде всего, это реализация явно не работает в случае сериализации, потому что x: Map[QuotedData,Double] стирается. Кроме того, я не могу использовать json4s, используя его. Каков правильный способ создания этого пользовательского сериализатора?

ответ

1

Json4s знает только о строковых клавишах на этом этапе, поэтому то, что вы пытаетесь достичь, не будет работать с картой.

1

Вы можете использовать пользовательский ключ сериалайзер

Например

class UUIDKeyJSonSerializer extends CustomKeySerializer[UUID](format => ({ 
    case s: String => { 
    UUID.fromString(s) 
    } 
}, { 
    case x: UUID => { 
    x.toString 
    } 
} 
)) 

Вы должны сопоставить объект в строку и наоборот

Смежные вопросы