将对象的 json 数组解析为适当的案例类

2024-04-08

我有一个 json 数组settings像这样:

[
  {
    "name": "Company Name",
    "key": "company_name",
    "default": "Foo"
  }, {
    "name": "Deposit Weeks",
    "key": "deposit_weeks",
    "default": 6
  }, {
    "name": "Is VAT registered",
    "key": "vat_registered",
    "default": false
  }
]

我想将其解析为Seq of Setting对象。我尝试通过使用特征并根据 json 对象中的数据类型定义不同的案例类来定义我的 json 格式:

sealed trait Setting
case class StringSetting(name: String, key: String, default: String) extends Setting
case class IntSetting(name: String, key: String, default: Int) extends Setting
case class BoolSetting(name: String, key: String, default: Boolean) extends Setting

现在我尝试解析 json:

val json = Json.parse(jsonStr)
implicit val jsonFormat: Format[Setting] = Json.format[Setting]

val result = Try(json.as[Seq[Setting]])

这里我得到一个编译错误:

错误:(19, 61) 未找到 unapply 或 unapplySeq 函数 隐式 val jsonFormat: Format[设置] = Json.format[设置]

有没有办法将每个设置映射到其适当的案例类?


  1. 天真的方法是提供 Reads[Setting](如果您的目标只是将 json 转换为对象),以便 JSON 反序列化器能够构建正确的设置变体。

    import play.api.libs.json._
    import play.api.libs.functional.syntax._
    
    implicit val settingReads: Reads[Setting] = (__ \ "default").read[String].map[Setting](StringSetting) |
                                        (__ \ "default").read[Int].map[Setting](IntSetting) |
                                        (__ \ "default").read[Boolean].map[Setting](BoolSetting)
    

但是,如果您在不同的子类中具有相同的“默认”类型,则这将不起作用。在这种情况下JSON反序列化器无法区分 这两个案例类别之间。

  1. 另一种方法是使用 play json 变体库。

    import julienrf.variants.Variants
    
    sealed trait Setting
    case class StringSetting(name: String, key: String, default: String) extends Setting
    case class IntSetting(name: String, key: String, default: Int) extends Setting
    case class BoolSetting(name: String, key: String, default: Boolean) extends Setting
    
    object Setting {
      implicit val format: Format[Setting] = Variants.format[Setting] 
    }
    

    Variant.format 为Setting 提供读取和写入。确保在声明所有可能的子类之后应进行“隐式 val 格式”的分配。

有关 play json 变体库的更多信息点击这里 https://github.com/julienrf/play-json-derived-codecs/tree/v2.0

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将对象的 json 数组解析为适当的案例类 的相关文章

随机推荐