重命名JSON对象返回到Spring MVC中的ResponseBody

时间:2013-09-26 08:06:21

标签: java json spring spring-mvc

假设我有一个像这样的对象列表: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没有使用此方法。

3 个答案:

答案 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