gpt4 book ai didi

json - 使用 Argonaut 或 Circe 从不完整的 JSON 更新案例类

转载 作者:行者123 更新时间:2023-12-02 22:45:06 24 4
gpt4 key购买 nike

在给定不完整的 json(缺少某些字段)的情况下,我需要从案例类实例创建更新的实例(隐式派生任何所需的 DecodeJson)。如何通过 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,然后将其转换为 Shapeless LabelledGeneric,然后以某种方式使用 Shapeless update 来更新案例类实例。

<小时/>

编辑2

阅读 Shapeless 源代码后,我发现我可以生成自己的“默认”对象。我设法创建了一个解决方案,该解决方案要求在解析 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)

最佳答案

为了完整起见:自 0.2 版本以来,已经提供了对此类“修补”实例的支持:

import io.circe.jawn.decode, io.circe.generic.auto._

case class Person(name: String, age: Int)

val person = Person("mr complete", 42)
val incompletePersonJson = """{"name":"mr updated"}"""

val update = decode[Person => Person](incompletePersonJson)

然后:

scala> println(update.map(_(person)))
Right(Person(mr updated,42))

我的原创blog post关于这项技术使用了 Argonaut(主要是因为我在开始研究 circe 之前几个月写了它),并且该实现是 available as a library ,尽管我从未在任何地方发布过它。

关于json - 使用 Argonaut 或 Circe 从不完整的 JSON 更新案例类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39308827/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com