首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有圆环光学的递归遍历JSON

具有圆环光学的递归遍历JSON
EN

Stack Overflow用户
提问于 2019-03-26 12:12:38
回答 2查看 370关注 0票数 5

我有一个结构复杂的json。就像这样:

代码语言:javascript
复制
{
  "a":"aa",
  "b":"bb",
  "c":[
    "aaa",
    "bbb"
  ],
  "d":{
    "e":"ee",
    "f":"ff"
  }
}

我想大写所有的字符串值。文献资料说:

代码语言:javascript
复制
root.each.string.modify(_.toUpperCase)

但是,按照预期,只更新根值。

如何使circe-optics递归遍历所有字符串值?

JSON的结构是未知的。

这是Scastie上的示例

通过注释:我期望所有字符串值都是超感知的,而不仅仅是根值:

代码语言:javascript
复制
{
  "a":"AA",
  "b":"BB",
  "c":[
    "AAA",
    "BBB"
  ],
  "d":{
    "e":"EE",
    "f":"FF"
  }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-16 21:34:28

这里有一个部分解决方案,如其中所示,它不是完全递归的,但它将解决示例中的json问题:

代码语言:javascript
复制
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)
票数 0
EN

Stack Overflow用户

发布于 2020-04-05 22:46:01

以下可能是一种新的方法。把它加在这里是为了完整。

代码语言:javascript
复制
  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)

给出

代码语言:javascript
复制
{
  "a" : "AA",
  "b" : "BB",
  "c" : [
    "AAA",
    {
      "k" : "ASDADS"
    }
  ],
  "d" : {
    "e" : "EE",
    "f" : "FF"
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55356876

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档