2016-01-06 1 views
0

Я использую JBoss 7.1.3.As.Final и создаю веб-приложение Spring 3.2.11.RELEASE. На моей странице JSP У меня есть этотКак использовать JSTL для вывода значения из строки JSON?

${jsonString} 

и то, что я хотел бы знать, если предположить это JSON строка имеет «имя» атрибут, как я использую JSTL (предпочтительно, не скриптлетов), чтобы распечатать значения, связанные с атрибут «name» для моей страницы? Неудивительно, что это не работает

${jsonString[‘name’]} 

ответ

0

Если вы можете использовать сторонние библиотеки (например, Jackson), он должен быть достаточно простым для выполнения этой функции. Вам все равно придется создавать некоторые java-файлы, чтобы сделать эту работу. Сначала создайте POJO, который соответствует вашим данным json (в вашем случае 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 (добавить библиотеку Джексона в приложении классов, а ваша папка 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 к вашему пути к классам, а также папку 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> 

Вы должны полностью избегать кода сценария, если вы переместите синтаксический анализ на сервлет.

+0

Объявленный вами jsonString является статическим. У меня есть одна строка, которая является атрибутом модели. Я хотел поймать эту строку, используя $ {employees}, но это дает ошибку. Любая идея, как это решить? – sbs

+0

$ {employees} доступен только для JSP, если он объявлен как атрибут (объект) или параметр (только строки). Например, вы можете установить свою переменную атрибута, как Request.setAttribute («employee», «Shahed Bin»); и на странице JSP, ссылающейся на эту переменную через $ {employee}, будет напечатан Shahed Bin. –

+0

Я понимаю. но, однако, согласен, у меня есть следующий объект модели: класс SomeClass { Строковые атрибуты; Строка jsonString; } Я могу передать этот объект SomeClass, как вы упомянули, но мне нужно проанализировать объект jsonString как json на странице jsp. Вот что мне было интересно! – sbs