Изменить тип поля JSON через Circe - PullRequest
3 голосов
/ 29 апреля 2019

У меня есть простой 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?

1 Ответ

2 голосов
/ 29 апреля 2019

Это должно работать, в зависимости от того, как вы хотите управлять лимитом (здесь я выкидываю исключение):

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"))
  )
)
...