2016-03-31 13 views
1

Angenommen, ich habe eine Markierung trait Ignore Ich möchte alle Felder, die mit dieser Eigenschaft markiert sind, während der Serialisierung ignoriert werden.json4s - Ignoriere das Feld eines bestimmten Typs während der Serialisierung

Also, wenn ich Klasse

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

die json für B nach Serialisierung conatin sollte nicht a Feld haben.

HINWEIS: Ich weiß, dass es eine Möglichkeit gibt, Feld nach Name zu ignorieren, aber das ist nicht das, was ich brauche.

Antwort

1

Sie können eine CustomSerializer verwenden. Sie können nur Serialisierung anpassen, indem Sie eine leeres PartialFunction als Deserializer Bereitstellung:

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}""")) 

edit: Zum Zeitpunkt des Schreibens (3.3.0) json4s-native hat einen Bug, das serialisierte Objekt rendert falsch, wenn die ersten Feld wird ignoriert (zB case class B(a: A, ...) ich schlage vor, mit json4s-jackson, bis das Problem

mit ersten Extraction.decompose gelöst und nach Serialization scheint das Problem zu lösen.

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

Ja, das funktioniert, aber wenn ich ein Feld am Anfang der Felder B setzen, erzeugt es ungültiges json. Zum Beispiel: 'Fallklasse B (a: A, d: Int)' ergibt '" {, d ": 2}" Wie kann man das beheben? – maks

+1

@maks Es funktioniert für mich: '{" d ": 2}'. Verwenden Sie eine alte Version von json4s? Ich bin auf 3.3.0 –

+0

@maks Ok, ich habe nicht überprüft, aber ich denke, dass mein Code funktioniert, weil ich json4s-jackson verwende. Verwenden Sie nativ? –

Verwandte Themen