使用jstl c:forEach在迭代jsp bean上创建javascript json对象

时间:2015-03-25 15:52:52

标签: javascript json jsp

我有两个java类

public class Abc{
   private List<SomeOtherClass> someClass;
   private String k;
   private String m;
}

public class SomeOtherClass{
   private String a;
   private String b;
   private String c;

}

我有一个jsp页面,我正在创建类Abc

的bean
<jsp:useBean id="someId" class="Abc" scope="request" />

现在在这个jsp和一个脚本标签里面我试图创建一个json对象的javascript数组

<script>
 var abc = (function(){
     module._myFunction = {
             "key1" :"<c:out value = '${someId.k}'/>",
             "key2" :{
                      <c:forEach varStatus='status' items='${someId.someClass}' var ="xyz">
                          "subKey1":"${xyz.a}",
                          "subKey2":${xyz.b}
                      </c:forEach>
                    }
              }
}(abc || {}))

</script>

但是这个片段引发了错误#34;意外字符串&#34;因为c:forEach循环中的代码。但是,如果我省略subkey1&amp; subKey2工作正常。我认为这是预期的。有什么办法可以创建这个json数组。 当我检查abc.key1是开发人员工具时,它给出了正确的价值。 有什么办法可以创建这个json数组并检查

abc.key2.subkey1 or abc.key2.subKey2  in developer console 

1 个答案:

答案 0 :(得分:0)

如果您的列表中有3个项目,并且您要展开代码的这一部分:

"key2" :{
    <c:forEach varStatus='status' items='${someId.someClass}' var ="xyz">
        "subKey1":"${xyz.a}",
        "subKey2":${xyz.b}
    </c:forEach>
}

看起来像是:

"key2" :{
        "subKey1":"a",
        "subKey2":b
        "subKey1":"1",
        "subKey2":2
        "subKey1":"y",
        "subKey2":z
}

这不是有效格式化的json数组。 (有关有效JSON数组的快速示例,请参见此处:http://www.w3schools.com/json/json_syntax.asp - 向下滚动到&#34; JSON数组&#34;)

您希望它看起来像是:

"key2" :[
        {
             "subKey1":"a",
             "subKey2":"b"
        },
        {
            "subKey1":"1",
            "subKey2":"2"
        },
        {
            "subKey1":"y",
            "subKey2":"z"
        }
 ]

所以你需要在每个元素周围使用大括号,如果大括号不是最后一个元素,则需要括号后的逗号,以及括号括起来的整个东西。以下是您将如何做到这一点:

"key2" : [
    <c:forEach varStatus='status' items='${someId.someClass}' var ="xyz">
        {
            "subKey1":"${xyz.a}",
            "subKey2":"${xyz.b}"
        }<c:if test="${!status.last}">,</c:if>
    </c:forEach>
]

注意:我没有对此进行测试,以确保我的示例没有拼写错误,所以如果您收到任何错误,请告诉我,我会告诉您如何修复它。