通过 circe 修改 json 字段类型

Modify json field type via circe

我有简单的Json:

val str = """{"test":"123"}"""

如何将 String "123" 修改为 Int 123 以获得新的 Json?:

{"test":123}

现在我正在使用:

val json = parse(str).getOrElse(Json.Null)
val jsObj = json.asObject.get  // Unsafe, just example
val newJson = Json.fromJsonObject(jsObj.remove("test").add("test", Json.fromInt(123)))

但是这段代码并不漂亮。

是否可以使此代码更漂亮或者可以通过 circe optics 来实现?

它应该根据你想如何管理极限情况来解决问题(这里我抛出一个异常):

import io.circe._
import io.circe.parser.parse

val str = """{"test":"123"}"""
val json = parse(str).getOrElse(Json.Null)
json.mapObject(
  _.mapValues( v =>
    v.asString
     .flatMap(parse(_).toOption)
     .getOrElse(throw new IllegalArgumentException("No String found"))
  )
)