3

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

4

3 回答 3

3

与其直接返回 List ,不如将其包装在 aResponseEntity中,这将为您提供没有根元素的响应

@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":"........

尽管您仍然在此处包装对象,但它是在免费提供的对象中,您不必添加自己的自定义类。

这是我们在几个@Controllers 中使用的,我们使用的是 Spring 3.2 和 Jackson 2.2。

于 2013-09-26T10:33:09.043 回答
0

将列表放入包装类是一种常用的实现策略

于 2013-09-26T08:07:57.687 回答
0

如果您使用的是 Jackson Mapper,您可以使用 Annotations 来定义类中的属性名称

@JsonProperty("foo")

或设置顺序

@JsonPropertyOrder({"foo", "bar"})

等等。

进一步查看杰克逊注解

编辑:对不起,刚刚看到包装评论。我看到的唯一解决方案是使用这样的包装器:How to rename root key in JSON serialization with Jackson

于 2013-09-26T10:16:43.987 回答