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);
}