Если вы можете использовать сторонние библиотеки (например, 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>
Вы должны полностью избегать кода сценария, если вы переместите синтаксический анализ на сервлет.
Объявленный вами jsonString является статическим. У меня есть одна строка, которая является атрибутом модели. Я хотел поймать эту строку, используя $ {employees}, но это дает ошибку. Любая идея, как это решить? – sbs
$ {employees} доступен только для JSP, если он объявлен как атрибут (объект) или параметр (только строки). Например, вы можете установить свою переменную атрибута, как Request.setAttribute («employee», «Shahed Bin»); и на странице JSP, ссылающейся на эту переменную через $ {employee}, будет напечатан Shahed Bin. –
Я понимаю. но, однако, согласен, у меня есть следующий объект модели: класс SomeClass { Строковые атрибуты; Строка jsonString; } Я могу передать этот объект SomeClass, как вы упомянули, но мне нужно проанализировать объект jsonString как json на странице jsp. Вот что мне было интересно! – sbs