使用JSTL在JSP中迭代JSONArray

时间:2013-01-22 09:30:05

标签: java json spring jstl arrays

我发送一个包含model的自定义对象列表,以及一个JSP作为视图。我的自定义对象有一个名为properties的属性,它是JSONObject。此属性的值为

{"services":[{"name":"abcd"},{"name":"efgh"}]}

现在我想迭代JSONArray [{"name":"abcd"},{"name":"efgh"}]。这是我正在做的循环

<c:if test="${not empty customObject.services}">
                 <c:forEach items="${customObject.services.getJSONArray(\"services\")}" var="Service" varStatus="rowCounterCh">
                     <li>${Service.name}</li>
                  </c:forEach>
 </c:if>

但是这不能遍历JSONArray。我得到了以下错误。

javax.servlet.ServletException: javax.servlet.jsp.JspTagException: Don't know how to iterate over supplied "items" in &lt;forEach&gt;

那么,我该怎么做才能遍历JSONArray?请帮忙

2 个答案:

答案 0 :(得分:6)

我有类似的东西

<c:forEach begin="0" end="${jsonArray.length() -1}" var="index">
     ${jsonArray.getJSONObject(index).getString("name")}
</c:forEach>

${jsonArray.length() -1}替换为您的jsonArray。在这种情况下,它就是这样的

${customObject.services.getJSONArray(\"services\").length()}

答案 1 :(得分:2)

对于每个标记,都需要一个基本界面。 JSONArray既不是 java.util.Collection 也不是 java.util.Iterable 。因此,对于每个标记,实现都不能迭代您传递给items属性的集合。

要解决此问题,您可以:

  1. 使用JSP生成HTML列表视图。
  2. 或者列表项将JSONArray转换为 customObject.services.getJSONArray 方法中的某个适当的Collection。 gson实现中的JSONArray应该有方法:iterator,因为它实现了Iterable接口。尝试在#getJSONArray(String)方法中返回com.google.gson.JSONArray#iterator()而不是JSONArray。

  3. more detailed explanation