Update Case Class von unvollständigem JSON mit Argonaut oder Circe

Ich muss eine aktualisierte Instanz aus einer Instanz einer Fallklasse erstellen (mit allen erforderlichenDecodeJsons implizit abgeleitet), bei unvollständigem json (einige Felder fehlen). Wie kann dies mit Argonaut (am besten) oder Circe (wenn ich muss) erreicht werden?

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, dass ich den JSON nach JSON AST analysieren und ihn dann in Shapeless konvertieren mussLabelledGeneric, dann aktualisiere die Instanz der Fallklasse mit Shapeless update.

Edit 2

Nach dem Lesen der Shapeless-Quelle habe ich festgestellt, dass ich mein eigenes "Default" -Objekt generieren kann. Es ist mir gelungen, eine Lösung zu erstellen, bei der die Instanz der case-Klasse beim Parsen des json vorhanden sein muss. Ich hatte gehofft, dies zu vermeiden und stattdessen die Instanz später bereitzustellen. 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 ergibtPerson(Old Name Kept,42).

Antworten auf die Frage(4)

Ihre Antwort auf die Frage