2016-11-09 8 views
0

私は現在json4s 3.2.10にいます。私はjson4sがバグであることを理解しています。これまでどおりに使用すべきではありませんが、これは従来のコードベースであり、jsonパーサーを切り替えることは現実的ではありません。Option [Seq [_]]がSome(List())の代わりにNoneにdeserializeするようにjson4sのバグを回避するには

存在しない(およびオプションの配列である)jsonフィールドが、としての代わりにSome(List())のクラスにデシリアライズされる状況があります。これは、ほぼ2年で解決されていないJson4sで知られている主要なバグです:

https://github.com/json4s/json4s/issues/198

他のバグのコメントは、カスタムの回避策に言及したが、詳細には触れません。私はこれに対処するために顧客のデシリアライザを書こうとしていますが、私はシンタックスと私が何をすべきかによって少し混乱しています。

私は ???近くで行うことが正確に何かわからない..but
import org.json4s.{Formats, Serializer, TypeInfo, _} 

class JsonSequenceOption[A] extends Serializer[Option[Seq[A]]] { 

    val Class = classOf[Option[Seq[A]]] 

    override def deserialize(implicit format: Formats) = { 
    case (TypeInfo(Class, _), seqJson) => { 
     //??? 
    } 
    } 

    override def serialize(implicit format: Formats) = { 
    case (seq : Option[Seq[A]]) => seq match { 
     case Some(a : Seq[A]) => JArray(a.map(x => JString(x.toString)).toList) 
     case None => JNothing 
    } 
    } 
} 

:私は次のようで始まりました。私は正しい道を下って行くのだろうか?もっと簡単な解決法はありますか?

答えて

0

カスタムシリアライザは必要ありませんでした。このプロジェクトではカスタムマーシャラーを使用しているため、簡単な解決策はextractOpt[A]extract[Seq[Option[A]]]に置き換えることです。

変更:

(someobject \ "someField").extractOpt[Seq[String]] 

へ:

(someobject \ "someField").extract[Option[Seq[String]]] 
関連する問題