scala - 使用 circe 在 Scala 中修改 JSON 数组
问题描述
我有一个带有数组的 JSON 字符串,如下所示:
{
"cars": {
"Nissan": [
{"model":"Sentra", "doors":4},
{"model":"Maxima", "doors":4}
],
"Ford": [
{"model":"Taurus", "doors":4},
{"model":"Escort", "doors":2}
]
}
}
我想编辑一个新的卡片品牌,在 scala 使用circe。
代替
"Nissan": [
{"model":"Sentra", "doors":4},
{"model":"Maxima", "doors":4},
]
我想有一个结果:
"Nissan": [
{"model":"Sentra", "doors":1000},
],
谢谢。
解决方案
看说明书后做的,下次也照样做!
除了您的 JSON 无效(数组中对象的尾随逗号之外,它应该看起来像这样:"Nissan"
)
import cats.syntax.either._
import io.circe._, io.circe.parser._
val json: String = """
{
"cars": {
"Nissan": [
{"model":"Sentra", "doors":4},
{"model":"Maxima", "doors":4}
],
"Ford": [
{"model":"Taurus", "doors":4},
{"model":"Escort", "doors":2}
]
}
}
"""
val newJson = parse(json).toOption
.flatMap { doc =>
doc.hcursor
.downField("cars")
.downField("Nissan")
.withFocus(_ =>
Json.arr(
Json.fromFields(
Seq(
("model", Json.fromString("Sentra")),
("doors", Json.fromInt(1000))
)
)
)
)
.top
}
newJson match {
case Some(v) => println(v.toString)
case None => println("Failure!")
}
试试看!(重新运行以查看正确的缩进!)
newJson
实际上是一个Option
,所以如果解析或修改失败,你会得到None
.
调用toOption
将parse(json)
返回的Either[Json]
(解析成功/失败)转换为Option[Json]
.
我们首先需要使用 an Option[Json]
,因为也.top
返回 a Option[Json]
(修改成功/失败)。
这样我们就可以flatMap
而且不必处理任何嵌套类型(见这里)。
推荐阅读
- reactjs - 如何测试这样的初始化文件?
- postgresql - 如何在 postgresql 10 (pgAdmin 4) 中查询外部数据?
- kotlin - 在 Kotlin 中锁定互斥锁的正确方法
- xamarin - 如何在 MVVM 中使用 ZXing?
- python - 在这种情况下,如何在 selenium 上选择更改的按钮
- javascript - 为什么 JS if() 函数没有在 safari 中执行?
- reactjs - react momentJS 获取所有交叉点
- html - 如何在不减小背景大小的情况下减小两个div之间的垂直距离
- django - Django API 性能突然下降
- azure - Azure 应用服务绑定通配符子域