【问题标题】:How do I turn this JSON array into an actual array with argonaut?如何使用 argonaut 将此 JSON 数组转换为实际数组?
【发布时间】:2021-07-14 17:25:40
【问题描述】:

我在一个单独的文件中有这个 JSON:

{
  "TestModel" : [
    {"query" : "select * from ci_lmaggregation.elementstest where hash_aggregation_key = 0 ALLOW FILTERING "},
    {"query" : "select * from ci_lmaggregation.elementstest where hash_aggregation_key = 1 ALLOW FILTERING "},
    {"query" : "select * from ci_lmaggregation.elementstest where hash_aggregation_key = 2 ALLOW FILTERING "}
  ]
}
}

我正在尝试遵循他们的快速入门,但它甚至没有找到“decodeOption”、“Parse.parse”或其他任何内容。我很困惑?

  val input_file = "[path]/FeatureMapping.json"
  val json_content = scala.io.Source.fromFile(input_file).mkString
  //it can't find decodeOption
  val json_data = json_content.decodeOption[List[Person]].getOrElse(Nil)
  //or Parse.parse (which should work given this http://argonaut.io/doc/parsing/)
  val jdata = Parse.parse(json_content)

所以我不完全确定如何完成我想做的事情。我试过遵循这个: Parse JSON array using Scala Argonaut

还有他们网站上的入门指南,但似乎都没有像这里那样处理数组情况的示例。此外,SO 帖子中的代码示例 codec3 显示为不存在,所以我也很困惑。

我只是想要一个查询数组作为文件中的字符串,为什么没有像在 python 中那样的简单方法呢?

【问题讨论】:

    标签: arrays json scala argonaut


    【解决方案1】:

    使用the Dijon library。如今,使用 Scala 处理无模式 JSON 是一种安全有效的方式。

    添加依赖:

    libraryDependency += "me.vican.jorge" %% "dijon" % "0.5.0"
    

    导入 Scala 的动态类型特性和库包:

    import scala.language.dynamics._
    import dijon._
    

    然后从您的 JSON 中解析并选择所需的值:

    val json = parse(
    """{
       |  "TestModel" : [
       |    {"query" : "select * from ci_lmaggregation.elementstest where hash_aggregation_key = 0 ALLOW FILTERING "},
       |    {"query" : "select * from ci_lmaggregation.elementstest where hash_aggregation_key = 1 ALLOW FILTERING "},
       |    {"query" : "select * from ci_lmaggregation.elementstest where hash_aggregation_key = 2 ALLOW FILTERING "}
       |  ]
       |}""".stripMargin
    )
    assert(json.TestModel.toSeq.map(_.query) == Seq(
      "select * from ci_lmaggregation.elementstest where hash_aggregation_key = 0 ALLOW FILTERING ",
      "select * from ci_lmaggregation.elementstest where hash_aggregation_key = 1 ALLOW FILTERING ",
      "select * from ci_lmaggregation.elementstest where hash_aggregation_key = 2 ALLOW FILTERING "
    ))
    

    【讨论】:

    • 啊,太棒了...这太棒了,但由于某种原因,如果我使用 0.5 版,我会得到一个 5.0 与 5.2 的 scala 签名错误,如果我使用 0.4 版,我会得到java.lang.NoClassDefFoundError: scala/runtime/java8/JFunction0$mcI$sp。不过,我可能会接受你的答案是正确的。感谢您花时间回答!
    • @troyblerg 随意to open an issue,特别是如果你有一个最小的项目要重现。
    猜你喜欢
    • 2013-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-13
    • 2015-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多