Изменить тип поля json через 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?


person Oleg    schedule 29.04.2019    source источник
comment
Хотя вам, вероятно, не нужно remove.   -  person slouc    schedule 29.04.2019


Ответы (1)


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

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"))
  )
)
person Benjamin Vialatou    schedule 29.04.2019
comment
Это не компилируется, но я исправляю. Спасибо за идею. json.mapObject( _.add("test",Json.fromInt(321))) - person Oleg; 29.04.2019