Ich muss eine aktualisierte Instanz aus einer Fallklasseninstanz erstellen (mit allen erforderlichen s implizit abgeleitet), mit einem unvollständigen JSON (einige Felder fehlen). Wie kann dies mit Argonaut (vorzugsweise) oder Circe (wenn ich muss) erreicht werden?Fallklasse von unvollständigem JSON mit Argonaut oder Circe aktualisieren
Beispiel:
case class Person(name:String, age:Int)
val person = Person("mr complete", 42)
val incompletePersonJson = """{"name":"mr updated"}"""
val updatedPerson = updateCaseClassFromIncompleteJson(person, incompletePersonJson)
println(updatedPerson)
//yields Person(mr updated, 42)
Ich bin mir ziemlich sicher, ich habe die json zu json AST zu analysieren, dann wandeln sie LabelledGeneric
formlos, dann Shapeless Update verwenden irgendwie den Fall Klasseninstanz zu aktualisieren.
bearbeiten 2
Nach der Shapeless Quelle Liest ich, dass ich finden kann meinen eigenen "Default" -Objekt erzeugen. Es ist mir gelungen, eine Lösung zu erstellen, bei der die Instanz der Fallklasse beim Parsen des Jsons vorhanden sein muss. Ich hatte gehofft, dies zu vermeiden und stattdessen die Instanz später zur Verfügung zu stellen. Jedenfalls ist es hier:
import shapeless._
import argonaut._
import ArgonautShapeless._
import shapeless.ops.hlist.Mapper
case class Person(name: String, age: Int)
object MkDefault {
object toSome extends Poly1 {
implicit def default[P] = at[P](Some(_))
}
def apply[P, L <: HList, D <: HList]
(p: P)
(implicit
g: Generic.Aux[P, L],
mpr: Mapper.Aux[toSome.type, L, D]
): Default.Aux[P, mpr.Out] =
Default.mkDefault[P, D](mpr(g.to(p)))
}
object Testy extends App {
implicit val defs0 = MkDefault(Person("new name? NO", 42))
implicit def pd = DecodeJson.of[Person]
val i = """{"name":"Old Name Kept"}"""
val pp = Parse.decodeOption[Person](i).get
println(pp)
}
Dies ergibt Person(Old Name Kept,42)
.
Debug ArgonautShapeless 'DecodeJson Schlussfolgerung (ArgonautShapeless.derivedDecodeJson), ich sehe, dass ein Objekt defaults = Defaults $ AsOptions $$ anon $ 9 wird mit Werten None :: None :: HNil instanziiert. Für mich scheint es, dass, wenn ich das irgendwie durch eine implizite Instanz ersetzen könnte, die ich mir selbst anbiete, ich Standardeinstellungen machen könnte, um den fehlenden JSON irgendwie zu füllen. – eirirlar
Das einzige, was ich mir vorstellen kann, dass es in einer typsicheren Weise tun würde, ist, Ihre vorhandene Fallklasse in json umzuwandeln, beide in eine Map [String, Any] umzuwandeln, dann die Maps zusammenzuführen, zurück in json zu konvertieren. dann reparse – Falmarri
@Falmarri das ist eigentlich keine so schlechte Idee, ich werde es als Backup-Lösung im Auge behalten, da es natürlich mehr Zeit und Ressourcen vom Computer erfordern würde. – eirirlar