Java 在SpringMVC中重命名返回到ResponseBody的JSON对象
假设我有这样一个对象列表:Java 在SpringMVC中重命名返回到ResponseBody的JSON对象,java,json,spring,spring-mvc,Java,Json,Spring,Spring Mvc,假设我有这样一个对象列表:LinkedList jsonAssessments… 返回到这种方法: @RequestMapping(value = "mapping", method = RequestMethod.POST) public @ResponseBody List<JsonAssessment> doSomething(....) { ..... } 问题是如何重命名根元素LinkedList?是否有任何配置我必须设置 编辑 我不想使用任何包装器对象 编辑 我
LinkedList jsonAssessments…
返回到这种方法:
@RequestMapping(value = "mapping", method = RequestMethod.POST)
public
@ResponseBody
List<JsonAssessment> doSomething(....) {
.....
}
问题是如何重命名根元素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.释放
杰克逊: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;
}
}
}
公共类JSONPropertyNamegStrategy扩展了PropertyNamegStrategy{
公共静态最终MyNamingStrategy MY_NAMING_STRATEGY=新MyNamingStrategy();
私有静态最终LinkedHashMap属性=新LinkedHashMap(){{
put(“链接列表”、“结果列表”);
}};
公共静态类MyNamingStrategy扩展了PropertyNamingStrategyBase{
@凌驾
公共字符串转换(字符串属性名称){
如果(propertyName==null){
返回null;
}
if(PROPERTIES.containsKey(propertyName)){
返回PROPERTIES.get(propertyName);
}
返回propertyName;
}
}
}
我正在调试它,当涉及到转换方法属性名时,除了根元素之外,其他所有属性名都会出现。我有
LinkedList
包含的所有内容,但是LinkedList
不支持这种方法。将列表放入包装类是一种常用的实现策略如果您使用Jackson Mapper,您可以使用注释来定义类中的属性名称
@JsonProperty("foo")
或者通过
@JsonPropertyOrder({"foo", "bar"})
等等
进一步看
编辑:
抱歉,刚刚看到包装器评论。我看到的唯一解决方案是使用这样的包装器:而不是直接返回列表,而是将其包装在一个
ResponseEntity
中,该属性将为您提供一个没有根元素的响应
@RequestMapping(value = "mapping", method = RequestMethod.POST)
public
@ResponseBody ResponseEntity<List<JsonAssessment>> doSomething(....) {
.....
return new ResponseEntity(yourList);
}
应输出{“assessments”:[{“assessmentName”:.
尽管您仍在这里包装对象,但它是在免费可用的对象中,您不必添加自己的自定义类
这就是我们在几个
@Controller
中所使用的,我们使用的是Spring 3.2和Jackson 2.2。没有使用包装类的其他策略吗?也必须有一种使用PropertyName策略的方法,我面临的问题是Spring MVC处理它的方式与序列化不同从JAXB对象直接使用ObjectMapper进行某些操作。在命名策略中,我没有获取“LinkedList”根元素属性名称,而从JAXB对象序列化时,我获取的是对象的根元素。谢谢,但这不是我的解决方案。如果指定序列化,可以避免在所有方法中使用ResponseEntityJSON对象映射器的功能:this.configure(SerializationFeature.WRAP_ROOT_VALUE,false);
(BTW false是默认值),然后它将返回JSON,而不带根元素,它将是{“assessments”:[{“assessmentName”:..
。但我需要一个根元素,我只想在没有任何包装的情况下重命名它。不幸的是,PropertyNamesStrategy对我仍然不起作用。您如何配置ObjectMapper?发布您的配置…还请指定您使用的Spring和Jackson版本。编辑了问题,请查看。知道为什么 返回新的响应(结果);
给出了这个编译时错误=不兼容的类型:Map无法转换为HttpStatus
您将这个ObjectMapper连接到哪里?这是正在使用的还是Spring默认的一个还在使用中?关于PropertyNameingStrategy
,您尝试了什么?最后一部分还不是很清楚。(你只提到它不起作用).Edited,请看一看。查看Jackson的源代码,PropertyNamingStrategy
不会有帮助,因为它只用于属性,而不用于根类型。从源代码来看,RootNameLookup
正在处理转换,它只允许通过使用注释进行不同的命名,否则它将失败回到类名。当使用JAXB注释时,jackson将使用这些注释作为元数据。
@RequestMapping(value = "mapping", method = RequestMethod.POST)
public
@ResponseBody ResponseEntity<List<JsonAssessment>> doSomething(....) {
.....
return new ResponseEntity(yourList);
}
@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);
}