使用Circe

时间:2018-02-15 09:49:23

标签: json scala dictionary null circe

继续此question,我有以下代码,但希望将null JSON值映射到Scala None。我目前的行为是,将keynull ("key": null)包括在一起并且不包括None之间没有区别。我想将此映射到null,以便我可以将数据库条目设置为key。此外,如果JSON中未包含import io.circe.jawn.decode, io.circe.generic.auto._ case class Person(name: String, age: Int, description: Option[String]) val existingPerson = Person("mr complete", 42, Some("tall and fat")) val incompletePersonJson = """{"description":null}""" val update = decode[Person => Person](incompletePersonJson) ,请将其映射到现有值。

scala> println(update.map(_(existingPerson)))
Right(Person(mr updated,42,Some(tall and fat)))

然后:

Right(Person(mr updated,42,None))

但我想得到:

<bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0" />

1 个答案:

答案 0 :(得分:0)

我最终得到了以下解决方案,它可能并不理想,并且它不使用Circe,但它可以帮我完成工作:

def getJsonNullKeys(json: Json): List[String] = {
  json.asObject match {
    case Some(jsonObject) => jsonObject.filter(j => j._2.isNull).keys.toList
      case None => List[String]()
    }
}

if (update.isRight) {
  update.right.map(_(existingPerson)) match {
    case Right(updatedPerson) =>
      getNullKeys(incompletePersonJson).foreach { key =>
        val field = existingPerson.getClass.getDeclaredField(key)
        field.setAccessible(true)
        field.set(updatedUpdate, None)
      }
      println(updatedUpdate)
      // outputs Person(mr updated,42,None)
    case Left(error) => println(error.toString)
  }
}

Hope Circe增加了对此的支持,因此可以移除所有这些样板。