如何使用JSTL从JSON字符串输出值?

问题描述 投票:2回答:1

我正在使用JBoss 7.1.3.As.Final并正在构建一个Spring 3.2.11.RELEASE Web应用程序。在我的JSP页面上,我有这个

${jsonString}

我想知道的是假设这个json字符串有一个属性“name”,我如何使用JSTL(最好没有scriptlet)打印出与我的页面“name”属性相关的值?不出所料,这不起作用

${jsonString[‘name’]}
json jsp jstl
1个回答
0
投票

如果您可以使用第三方库(例如Jackson),那么完成此功能应该相当简单。您仍然需要创建一些Java文件才能使其工作。首先,创建一个与您的json数据匹配的POJO(在您的情况下,Employee可能是其他东西,但您的POJO应该与您的字段匹配)。

public class Employee{
private String name;
private int age;
private String company;
public String getName(){
    return name;
}
public String getCompany(){
    return company;
}
public Integer getAge(){
    return age;
}
//implement setters
}

接下来,像这样为Employee类创建一个列表包装器

 public class EmployeeList {
 public List<Employee> employees=new ArrayList<Employee>(); 
 }

现在,创建一个JsonParser类(将Jackson库添加到app classpath以及app lib文件夹)

 import org.codehaus.jackson.map.ObjectMapper;

 public class JsonParser {  
 ObjectMapper objectMapper=new ObjectMapper();
 public <T> T parseJson(String json,Class<T> targetType)throws Exception{   
//uncomment this line if you want to ignore some fields, they dont have to   be in your POJO then    
 //objectMapper.configure(Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);

 return objectMapper.readValue(json, targetType);
}
    }

请注意,JsonParser可以处理任何类型,而不仅仅是Employee。现在,在你的jsp中添加以下导入(将jstl-1.2.jar添加到你的类路径以及你的app lib文件夹)

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

将以下代码添加到正文部分

<body>
<%@ page import="java.util.List"%>
<%@ page import="apps.simpleweb.json.JsonParser"%>
<%@ page import="apps.simpleweb.data.Employee"%>
<%@ page import="apps.simpleweb.data.EmployeeList"%>
<%
//example json string ; note that employees matches the list name
String jsonString = "{  \"employees\":  [ {\"name\": \"Peter\", \"age\":  25, \"company\": \"XXXX\" },{ \"name\": \"Mark\", \"age\":45, \"company\": \"XXXX\"} ] }";

JsonParser parser = new JsonParser();
EmployeeList empList = parser.parseJson(jsonString, EmployeeList.class);
request.setAttribute("employeeList", empList.employees);
%>
 <c:forEach items="${employeeList}" var="employee" >
<c:out  value="Name : ${employee.name}" />
<c:out  value="Age : ${employee.age}"   />
 </c:forEach>

如果将解析移动到servlet,则应该能够完全避免使用scriptlet代码。

© www.soinside.com 2019 - 2024. All rights reserved.