如何使用 th:each 在 Thymeleaf 中迭代 JSONObject 列表

How to Iterate List of JSONObject in Thymeleaf using th:each

这是来自 Spring MVC 控制器的 JSONObject 列表。

List<JSONObject> jsonDataList =
 
[{"key1":"value1","key2":"value2","key3":"value3","key4":"value4"}, {"key1":"value1","key2":"value2","key3":"value3","key4":"value4"}]

如何使用 th:each 在 Thymeleaf 中迭代 JSONObject 列表?

代码在 HTML 文件中:=>

 <tr th:each="data: ${jsonDataList}">   
    <td align="center"><span th:text="${data.key1}"></span></td>   // getting exception here                 
 </tr>

获取异常为: 由以下原因引起:org.attoparser.ParseException:评估 SpringEL 表达式的异常:“data.key1”

这是一种方法,但它做了一些假设:

a) 每个 JSON object 都有相同数量的条目(否则你可能会有一个参差不齐的 table,每行包含不同数量的单元格)。

b) 每个 JSON object 具有相同顺序的相同键(如果您希望 table 具有一致的列标题)。

此外,问题中的示例 JSON 假定所有值都是字符串(value1 等等)。如果您的 JSON 值中有不同类型的 object,那么您将需要确保它们具有所需的字符串表示形式(例如使用 toString())。

方法:

<table>
    <tr> 
        <th:block th:each="heading : ${jsonDataList.get(0).names()}">
            <th th:text="${heading}"></th>
        </th:block>
    </tr>
            
    <tr th:each="item : ${jsonDataList}">
        <th:block th:each="name : ${item.names()}">
            <td th:text="${item.get(name)}"></td>              
        </th:block>
    </tr>
</table>

第一个 <tr> 部分处理读取列表中第一个 object 中的 JSON object 键:

${jsonDataList.get(0).names()}

最后的 <tr> 部分类似,但使用键查找它们的相关值:

${item.get(name)}

结果 HTML 给你一个简单的 table:

<table>
    <tr>                 
        <th>key1</th>                
        <th>key2</th>                
        <th>key3</th>                
        <th>key4</th>                
    </tr>            
    <tr>                
        <td>value1</td>                              
        <td>value2</td>                              
        <td>value3</td>                              
        <td>value4</td>                              
    </tr>            
    <tr>                
        <td>value1</td>                              
        <td>value2</td>                              
        <td>value3</td>                              
        <td>value4</td>              
    </tr>
</table>


参考文献:

th:block 标记已记录 here

可用于 JSONObject 的方法记录在案 here

这个怎么样?

<tr th:each="data: ${jsonDataList}">   
  <td align="center"><span th:text="[[${data.key1}]]"></span></td> 
</tr>