我有一个结构复杂的json。就像这样:
{
"a":"aa",
"b":"bb",
"c":[
"aaa",
"bbb"
],
"d":{
"e":"ee",
"f":"ff"
}
}我想大写所有的字符串值。文献资料说:
root.each.string.modify(_.toUpperCase)但是,按照预期,只更新根值。
如何使circe-optics递归遍历所有字符串值?
JSON的结构是未知的。
这是Scastie上的示例。
通过注释:我期望所有字符串值都是超感知的,而不仅仅是根值:
{
"a":"AA",
"b":"BB",
"c":[
"AAA",
"BBB"
],
"d":{
"e":"EE",
"f":"FF"
}
}发布于 2019-06-16 21:34:28
这里有一个部分解决方案,如其中所示,它不是完全递归的,但它将解决示例中的json问题:
val level1UpperCase = root.each.string.modify(s => s.toUpperCase)
val level2UpperCase = root.each.each.string.modify(s => s.toUpperCase)
val uppered = (level1UpperCase andThen level2UpperCase)(json.right.get)发布于 2020-04-05 22:46:01
以下可能是一种新的方法。把它加在这里是为了完整。
import io.circe.Json
import io.circe.parser.parse
import io.circe.optics.JsonOptics._
import monocle.function.Plated
val json = parse(
"""
|{
| "a":"aa",
| "b":"bb",
| "c":[
| "aaa",
| {"k": "asdads"}
| ],
| "d":{
| "e":"ee",
| "f":"ff"
| }
|}
|""".stripMargin).right.get
val transformed = Plated.transform[Json] { j =>
j.asString match {
case Some(s) => Json.fromString(s.toUpperCase)
case None => j
}
}(json)
println(transformed.spaces2)给出
{
"a" : "AA",
"b" : "BB",
"c" : [
"AAA",
{
"k" : "ASDADS"
}
],
"d" : {
"e" : "EE",
"f" : "FF"
}
}https://stackoverflow.com/questions/55356876
复制相似问题