【发布时间】:2013-09-26 08:06:21
【问题描述】:
假设我有一个这样的对象列表:LinkedList<JsonAssessment> jsonAssessments...。
返回这种方法:
@RequestMapping(value = "mapping", method = RequestMethod.POST)
public
@ResponseBody
List<JsonAssessment> doSomething(....) {
.....
}
我正在对这个控制器进行 AJAX 调用,一切都按预期正常工作,但我不喜欢命名我的 JSON 被返回。在我看到的萤火虫中:
{"LinkedList":[{"assessmentName":"........
问题是如何重命名根元素LinkedList?有什么需要设置的吗?
编辑
我不想使用任何包装对象。
编辑
我的对象映射器:
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 不会使用此方法。
【问题讨论】:
-
你在哪里连接这个 ObjectMapper?这是正在使用的还是 Spring 默认的仍在使用?另外,您对
PropertyNamingStrategy做了什么尝试?最后一部分还不是很清楚。 (你只提到它不起作用)。 -
已编辑,请查看。
-
查看 Jackson 的源代码
PropertyNamingStrategy并没有帮助,因为它仅用于属性而不是根类型。从源代码来看,RootNameLookup正在处理翻译,并且只允许通过使用注释来进行不同的命名,否则它将回退到类名。当使用 JAXB 注释时,杰克逊将使用这些注释作为元数据。
标签: java json spring spring-mvc