在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;
答案 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。