在 Struts2 中,我需要任意重命名来自我的List<CustomObject>
集合的 JSON 输出中的一些字段。
从 Struts 2.5.14 开始,有一种方法可以定义自定义 JsonWriter, http://struts.apache.org/plugins/json/#customizing-the-output
但我的应用程序在 Struts 2.3.34 中。
例如,我需要什么:
支柱.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;
}
杰伦
{
"records": [
"field1" : "data 1",
"field2" : "data 2"
]
}
现在我需要映射/重命名任意字段:例如field1 -> renamedField1
期望的结果:
{
"records": [
"renamedField1" : "data 1",
"field2" : "data 2"
]
}
杰克逊注释@JsonProperty
没有效果:
@JsonProperty("renamedField1")
private String field1;
也许您可以使用注释@JsonProperty("renamedField1"(,但您需要使用杰克逊对象映射器映射对象以获得预期的结果,这里有一个如何使用杰克逊对象映射器的示例
public String retrieveJson() throws Exception {
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(service.getRecords());
return json;
}
我的最终答案是基于sark2323
关于直接使用杰克逊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;
}
}
支柱.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 方法将其输出为纯字符串。