2016-03-31 18 views
1

Bazı işaretleyici var trait Ignore Bu özelliğin işaretli tüm alanlarının serileştirme sırasında yok sayılmasını istiyorum.json4s - Serileştirme sırasında belirli bir türü yok sayma

Yani varsa sınıfı

case class A(a: Int) extends Ignore 
case class B(f: String, a: A, d: Int) 

serileştirme sonra B için json a alanını conatin olmamalıdır.

NOT: Alan adının yok sayılması için bir fırsat olduğunu biliyorum, ancak ihtiyacım olan şey bu değil.

cevap

1

CustomSerializer'u kullanabilirsiniz. Sen deserializer olarak boş bir PartialFunction sağlayarak sadece seri özelleştirebilirsiniz:

trait Ignore 
case class A(a: Int) extends Ignore 
case class B(f: String, a: A, d: Int) 

implicit val formats = DefaultFormats + 
    new CustomSerializer[Ignore](formats => (
    PartialFunction.empty, 
    { case _: Ignore => JNothing } 
)) 

// prints "{"f":"x","d":2}" 
println(Serialization.write(B("x", A(1), 2))) 
// deserializes to B(x,A(1),2) 
println(Serialization.read[B]("""{"f":"x","a":{"a":1},"d":2}""")) 

düzenleme: (3.3.0) json4s-yerli yazma zamanda hatalı tefrika nesneyi kılan bir hata var ilk eğer alan dikkate alınmaz (case class B(a: A, ...) sorun Serialization sonraki ilk Extraction.decompose ve kullanma

çözülene kadar sorunu çözmek için json4s-jackson görünüyor kullanmanızı öneririz.

trait Ignore 
case class A(a: Int) extends Ignore 
case class B(a: A, d: Int) 

implicit val formats = DefaultFormats + 
    new CustomSerializer[Ignore](formats => (
    PartialFunction.empty, 
    { case _: Ignore => JNothing } 
    )) 

// prints {,"d":2} 
println(Serialization.write(B(A(1), 2))) 
// prints {"d":2} 
println(Serialization.write(Extraction.decompose(B(A(1), 2)))) 
+0

Evet, bu işe yarar, ancak B alanının başlangıcına bir alan koyarsam geçersiz json üretir. E.g .: 'dava sınıfı B (a: A, d: İnt)' '' {{"" d ": 2}" 'nasıl üretilir? – maks

+1

@maks Benim için çalışıyor: '{" d ": 2}'. Eski bir json4s sürümünü mi kullanıyorsunuz? 3.3.0 –

+0

@ kullanıyorum Tamam, kontrol etmedim ama kodum işe yarıyor çünkü json4s-jackson kullanıyorum. Yerli kullanıyor musunuz? –

İlgili konular