Struts2(2.3.34)重命名JSON输出中的某些对象字段

时间:2018-08-22 19:58:27

标签: json struts2

在Struts2中,我需要任意重命名来自List<CustomObject>集合的JSON输出中的某些字段。

从Struts 2.5.14开始,可以定义自定义JsonWriter, http://struts.apache.org/plugins/json/#customizing-the-output

但是我的应用程序在Struts 2.3.34中。

例如我需要的东西:

struts.xml

<action name="retrieveJson" method="retrieveJson" class="myapp.MyAction">
    <result type="json">
    </result>       
</action>

服务器端返回列表

public String retrieveJson() throws Exception {
    records = service.getRecords(); // This is a List<Record>
    return SUCCESS;
}

记录对象示例

public class Record {
    String field1; // Getter/setters
    String field2;
}

JSON

{
   "records": [
       "field1" : "data 1",
       "field2" : "data 2"
   ]
}

现在我需要映射/重命名任意字段:例如field1 -> renamedField1

所需结果:

{
   "records": [
       "renamedField1" : "data 1",
       "field2" : "data 2"
   ]
}

Jackson注释@JsonProperty无效:

@JsonProperty("renamedField1")
private String field1;

2 个答案:

答案 0 :(得分:1)

也许您可以使用注释@JsonProperty(“ renamedField1”),但是您需要使用jackson对象映射器来映射对象以获得预期的结果,这里有一个示例如何使用jackson对象映射器

public String retrieveJson() throws Exception {
    ObjectMapper mapper = new ObjectMapper();
    String json = mapper.writeValueAsString(service.getRecords());
    return json;
}    

答案 1 :(得分:1)

基于sark2323关于直接使用Jackson的ObjectMapper的提示,我的最终答案。

服务器端

public class MyAction {

    private InputStream modifiedJson; // this InputStream action property
                                        // will store modified Json
    public InputStream getModifiedJson() {
        return modifiedJson;
    }
    public void setModifiedJson(InputStream modifiedJson) {
        this.modifiedJson = modifiedJson;
    }    

    // Now the handler method
    public String retrieveJson() throws Exception {
        ObjectMapper mapper = new ObjectMapper();
        List<Publication> records = service.getRecords();

        String result = mapper.writeValueAsString(records);

        modifiedJson = new ByteArrayInputStream(result.getBytes());
        return SUCCESS;
    }
}  

struts.xml

<action name="retrieveJson" method="retrieveJson" class="myapp.MyAction">
    <result type="stream">
        <param name="contentType">text/plain</param>
        <param name="inputName">modifiedJson</param>
    </result>       
</action>

结果是一个流(即纯字符串),因为我们要避免Struts的内部JSON编组,这会引入字符转义。 Jackson已经产生了JSON字符串,现在我们只是通过Stream方法将其输出为Plain String。