【问题标题】:Scala 2.10: Array + JSON arrays to hashmapScala 2.10:数组 + JSON 数组到 hashmap
【发布时间】:2012-12-28 23:13:17
【问题描述】:

从 Web 服务响应读取 JSON 结果后:

val jsonResult: JsValue = Json.parse(response.body)

包含类似以下内容的内容:

{
    result:  [
    ["Name 1", "Row1 Val1", "Row1 Val2"],
    ["Name 2", "Row2 Val1", "Row2 Val2"]
             ]
 }

如何有效地将 JSON 中结果数组的内容映射到一个列表(或类似的东西),例如:

val keys = List("Name", "Val1", "Val2")

要获取哈希图数组?

【问题讨论】:

  • 您应该更明确地了解输入(嵌套的List[List[String]] 和输出(List[String])之间的关系......还是输出是“[hash] 映射数组”? . 如果 map 的序列实际上是期望的最终结果,那么它与您的输入的关系就更不清楚了。
  • 我正在寻找类似的结果: List(Map("Name" -> "Name 1", "Val1" -> "Row1 Val1", "Val2" -> " Row1 Val2"), Map("Name" -> "Name 2", "Val1" -> "Row2 Val1", "Val2" -> "Row2 Val2"))
  • 对不起,你真的没有把你的假设说清楚。请尝试准确指定结果/输出与输入的关系。我感觉到有某种字符串操作在起作用,但我不能确定。我并不是说乏味,但这就是编程的意义所在。对程序的输出与输入之间的关系完全清楚且毫不含糊。

标签: json scala map hashmap


【解决方案1】:

这样的? 这个解决方案是功能性的,可以“正确”处理 None/Failure 情况(通过返回 None)

val j = JSON.parseFull( json ).asInstanceOf[ Option[ Map[ String, List[ List[ String ] ] ] ] ]

val res = j.map { m ⇒
    val r = m get "result"
    r.map { ll ⇒
        ll.foldRight( List(): List[ Map[ String, String ] ] ) { ( l, acc ) ⇒
            Map( ( "Name" -> l( 0 ) ), ( "Val1" -> l( 1 ) ), ( "Val2" -> l( 2 ) ) ) :: acc
        }
    }.getOrElse(None) 
}.getOrElse(None) 
  • 注意 1:我必须在 JSON 字符串中的 result 周围加上双引号才能使 JSON 解析器正常工作
  • 注意 2:使用更多“单子”糖(例如用于推导式或使用应用函子)会使代码看起来更好

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-19
    • 2019-05-03
    • 2016-02-22
    • 1970-01-01
    • 2015-12-23
    • 2016-12-23
    • 2017-10-17
    • 1970-01-01
    相关资源
    最近更新 更多