假设我有一个像这样的对象列表:LinkedList<JsonAssessment> jsonAssessments...
。
它返回到这种方法:
@RequestMapping(value = "mapping", method = RequestMethod.POST)
public
@ResponseBody
List<JsonAssessment> doSomething(....) {
.....
}
我正在对此控制器进行AJAX调用,所有内容都按预期正常工作,但我不喜欢命名我的JSON被返回。在萤火虫中我看到了:
{"LinkedList":[{"assessmentName":"........
问题是如何重命名该根元素LinkedList
?我必须设置任何配置吗?
修改
我不想使用任何包装器对象。
修改
我的ObjectMapper:
public class JsonObjectMapper extends ObjectMapper {
public JsonObjectMapper() {
super();
this.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);
this.configure(SerializationFeature.WRAP_ROOT_VALUE, true);
this.setSerializationInclusion(JsonInclude.Include.NON_NULL);
}
}
春天:3.2.4.RELEASE 杰克逊:2.1.2
修改
此对象映射器在MVC消息转换器中声明:
<mvc:annotation-driven content-negotiation-manager="contentNegotiationManager">
<mvc:message-converters>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper" ref="jsonObjectMapper"/>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
这就是我尝试过的命名策略:
public class JsonPropertyNamingStrategy extends PropertyNamingStrategy {
public static final MyNamingStrategy MY_NAMING_STRATEGY = new MyNamingStrategy();
private static final LinkedHashMap<String, String> PROPERTIES = new LinkedHashMap<String, String>() {{
put("LinkedList", "resultList");
}};
public static class MyNamingStrategy extends PropertyNamingStrategyBase {
@Override
public String translate(String propertyName) {
if (propertyName == null) {
return null;
}
if (PROPERTIES.containsKey(propertyName)) {
return PROPERTIES.get(propertyName);
}
return propertyName;
}
}
}
我正在调试它,当涉及到翻译方法属性名称时,除了根元素之外都会出现。我拥有LinkedList
包含的所有内容,但LinkedList
没有使用此方法。
答案 0 :(得分:3)
不是直接返回List,而是将其包含在ResponseEntity
内,这将为您提供没有根元素的响应
@RequestMapping(value = "mapping", method = RequestMethod.POST)
public
@ResponseBody ResponseEntity<List<JsonAssessment>> doSomething(....) {
.....
return new ResponseEntity(yourList);
}
这样你就没有根元素了。如果您仍想要根元素,可以将其添加到Map
。结果如下JSON "[{"assessmentName":"........]
@RequestMapping(value = "mapping", method = RequestMethod.POST)
public
@ResponseBody ResponseEntity<Map<String, List<JsonAssessment>>> doSomething(....) {
.....
Map results = new HashMap();
result.put("assesments", yourlist);
return new ResponseEntity(results);
}
应输出{"assesments":[{"assessmentName":"........
虽然你在这里仍然要包装对象,但它是在免费提供的对象中,你不必添加自己的自定义类。
这是我们在@Controller
的几个中使用的,我们使用的是Spring 3.2和Jackson 2.2。
答案 1 :(得分:0)
将列表放在包装类中是一种常用的策略
答案 2 :(得分:0)
如果您使用的是Jackson Mapper,则可以使用Annotations通过
定义类中属性的名称@JsonProperty("foo")
或按
设置顺序@JsonPropertyOrder({"foo", "bar"})
等等。
进一步查看Jackson Annotations
编辑: 对不起,刚看到包装评论。我看到的唯一解决方案是使用这样的包装器:How to rename root key in JSON serialization with Jackson