2013-04-24 58 views
1

由於Json4s只有在關鍵字是字符串時才帶有Map序列化,因此我試圖使用Java枚舉作爲關鍵字爲特定Map編寫自定義序列化程序。所有的爲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 
    } 
} 
)) 

您需要將對象映射到一個字符串,反之亦然