Обновление класса дел из неполного JSON с помощью Argonaut или Circe

Мне нужно создать обновленный экземпляр из экземпляра класса дела (с любым необходимымDecodeJsons неявно получено), учитывая неполный JSON (некоторые поля отсутствуют). Как это можно сделать с помощью Argonaut (желательно) или Circe (если мне нужно)?

Пример:

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) 

Я уверен, что мне нужно разобрать JSON в JSON AST, а затем преобразовать его в ShapelessLabelledGeneric, затем используйте Shapeless update для обновления экземпляра класса дела.

Редактировать 2

После прочтения источника Shapeless я обнаружил, что могу создать свой собственный объект по умолчанию. Мне удалось создать решение, которое требует присутствия экземпляра класса case при анализе json. Я надеялся избежать этого и вместо этого предоставить инсталяцию позже. В любом случае вот оно:

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

Это даетPerson(Old Name Kept,42).

Ответы на вопрос(2)

Ваш ответ на вопрос