【问题标题】:How do I use JSTL to output a value from a JSON string?如何使用 JSTL 从 JSON 字符串中输出值?
【发布时间】:2016-01-06 20:57:05
【问题描述】:

我正在使用 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】:

    如果您可以使用第三方库(例如 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 库添加到应用程序类路径以及您的应用程序库文件夹)

     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 添加到您的类路径以及您的应用程序库文件夹中)

    <%@ 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 代码。

    【讨论】:

    • 您声明的 jsonString 是静态的。我有一个字符串作为模型属性。我想使用 ${employees} 来捕获该字符串,但这会产生错误。知道如何解决这个问题吗?
    • ${employees} 只有在声明为属性(对象)或参数(仅限字符串)时才能被 JSP 访问。例如,您可以设置属性变量,例如 Request.setAttribute("employee", "Shahed Bin");并在您的 JSP 页面中通过 ${employee} 引用此变量将打印 Shahed Bin。
    • 我明白了。但是,考虑到我有以下模型对象: class SomeClass { String attributes;字符串 jsonString;我可以传递您提到的 SomeClass 对象,但我需要将 jsonString 对象解析为 jsp 页面中的 json。这就是我好奇的地方!
    • 你为什么不在一个新线程中发布这个(带有一些代码)?这样你就更有可能得到一些好的答案。
    • 是的可能!我在控制器中解决了它。但我当然不喜欢它现在的样子。不过还是谢谢!
    猜你喜欢
    • 2021-07-21
    • 2019-06-19
    • 1970-01-01
    • 2015-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-01
    相关资源
    最近更新 更多