【发布时间】:2016-02-23 15:59:39
【问题描述】:
我们使用的是 Play 框架 2.3.4。我们从其中一个 API 对第三方服务进行 Web 服务调用 - 返回响应的结构是动态的并且可能会发生变化。只有响应 JSON 中的静态子结构是特定元素并嵌套在其中。例如
{
"response":
{
"someElement1": "",
"element2": true,
"buckets": [
{
"key": "keyvalue",
"docCount": 10,
"somethingElse": {
"buckets": [
{
"key": "keyvalue1",
"docCount": 5,
"somethingElseChild": {
"buckets": [
{
"key": "Tan",
"docCount": 1
}
]
}
},
{
"key": "keyvalue2",
"docCount": 3,
"somethingElseChild": {
"buckets": [
{
"key": "Ban",
"docCount": 6
}
]
}
}
]
}
}
]
}
}
我们不知道响应结构会是什么样子,但我们唯一知道的是响应中的某处会有“桶”嵌套元素,正如您所见,a 中还有其他嵌套的“桶”顶级“桶”元素。另请注意buckets 数组内部的结构也不清楚,如果会有另一个子存储桶,则肯定子存储桶必须位于父级bucket 内部的某个位置——这样模式是一致的。
解析这种递归结构并以递归方式填充Bucket 类的最佳方法是什么?
case class Bucket(key:String,docCount, subBuckets: List[Bucket] )
首先我想
val json = Json.parse(serviveResponse)
val buckets = (json \ "response" \\ "buckets")
但这不会带来buckets 递归而不是正确的遍历方式。
有什么想法吗?
【问题讨论】:
-
@Reactormonk :虽然我更愿意继续使用 play json,因为我们已经在项目的其他地方大量使用了 play json。如果 argnaut 要为手头的问题提供优雅/高效的解决方案,我愿意使用 argnaut 来满足这个特殊要求。我只看过argonaut,但从未使用过它。您介意分享更多关于如何使用 argonaut 实现这一目标的详细信息吗?
-
@Reactormonk :刚刚在问题中添加了 argonaut 标签 - 如果您可以分享您的答案。
-
使用 argonaut 是一个侧切线。你只是想递归地构建你的数据结构,对吧?写一个递归方法。
-
@RexKerr:当然。我的问题不在于如何编写递归方法;但是如何使用 JsPath (playframework.com/documentation/2.2.x/api/scala/…) 递归地查找“桶”- 我不知道路径的前期知识。
标签: scala playframework playframework-2.3 argonaut