Play框架 - 如何在视图中遍历JsonNode的树形结构?

3

你好,我想在视图中显示嵌套的JSON数据,就像从API接收响应时在Advanced REST Client中看到的那样。

我找到了这个问题,基本上是在问我现在正在问的东西;但是,我想使用Play Framework 2.3.x在视图中显示结果。我知道我需要一个递归函数来显示所有的json对象,所以我尝试在我的视图中使用可重用的块。这是我现在拥有的:

@(fromAPI: com.fasterxml.jackson.databind.JsonNode)

@import com.fasterxml.jackson.databind.JsonNode

@walkJsonTree(name: String, node: JsonNode) = {

    @if(node.isObject()) {

        @for(nodeEntry <- node.fields()) {
            <li>@nodeEntry.getKey(): </li>
            <ul>@walkJsonTree(nodeEntry.getKey(), nodeEntry.getValue())</ul>
        }
    }
    @if(node.isArray()) {
        @for(arrayNode <- node.fields()) {
            <li>[List]: </li>
            <ul>@walkJsonTree(arrayNode.getKey(), arrayNode.getValue())</ul>
        }
    }
    @if(node.isValueNode()) {
        <li>@node.asText()</li>
    } else {
        @* other *@
        <li>@node.asText()</li>
    }

}

@main("API Response") {

    <div class="container">
        <h3>API Response</h3>

        <ul>
            @walkJsonTree(null, fromAPI)
        </ul>
    </div>
}

很遗憾,这个没有正确显示JSON。它只基于这一行代码 <li>@nodeEntry.getKey(): </li> 显示第一个对象的名称。我做错了什么?有没有其他关于以嵌套方式显示JSON的建议?谢谢!
1个回答

1
我之前对 "array" 的 if 块有误。它应该使用 elements() 函数而不是 fields()。这里是更新后的代码,包括对 <ul><li> 元素的清理。
@(fromAPI: com.fasterxml.jackson.databind.JsonNode)

@import com.fasterxml.jackson.databind.JsonNode

@walkJsonTree(name: String, node: JsonNode) = {

    @if(node.isObject()) {
        <ul>
            @for(nodeEntry <- node.fields()) {
                <li>@nodeEntry.getKey(): @walkJsonTree(nodeEntry.getKey(), nodeEntry.getValue())</li>
            }
        </ul>
    }
    @if(node.isArray()) {
        <ul>
            @for(arrayNode <- node.elements()) {
                <li>[List]: @walkJsonTree(name, arrayNode)</li>
            }
        </ul>
    }
    @if(node.isValueNode()) {
        @node.asText()
    } else {
        @* other *@
        @node.asText()
    }

}

@main("API Response") {

    <div class="container">
        <h3>API Response</h3>
        @walkJsonTree(null, fromAPI) 
    </div>
}

这个可能在美学方面仍有改进的空间,但它满足了我想要的最小功能要求。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接