您好我正在尝试在我的视图中显示嵌套的JSON数据,类似于当您从API获得响应时它在Advanced REST Client中的显示方式。
我发现this question基本上问我要问的事情;但是,我想使用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?
谢谢!
答案 0 :(得分:0)
我有&#34;阵列&#34; 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>
}
这可能仍然可以在美学上得到改善,但它满足我想要的最少功能