Spring控制器返回字符串为纯json

时间:2017-05-18 12:58:21

标签: spring-mvc

我从spring控制器返回一个字符串对象,如

@RequestMapping(value = "/persons.html", method = RequestMethod.GET)
public @ResponseBody String listPersonHtml(Model model) {
    return "{\"abc\":\"test\"}";
}

我得到的答案就像“{\”abc \“:\”test \“}”,我希望这个回复为

{ “ABC”: “测试”}

即纯json对象。

我需要什么类型的配置?

在UI方面,如果我设置了Accept */*,那么我就会遇到此问题,如果我设置了Accept text/htmlAccept text/plain,那么就没有问题,但我无法更改接受标头。

2 个答案:

答案 0 :(得分:1)

我找到了方法。它全部都是关于spring message-converters。我在这个列表中添加了MappingJackson2HttpMessageConverter,这个转换器尝试将字符串转换为json并产生这个结果。 只需在MappingJackson2HttpMessageConverter之前添加org.springframework.http.converter.StringHttpMessageConverter,以便StringHttpMessageConverter可以生效,字符串可以按原样返回。

答案 1 :(得分:1)

一个老问题,但是我只需要解决同样的问题,我发现的大多数答案都产生了误导,所以这是我的:

这一切都始于Controller,Spring尝试以调用客户端期望的格式回答映射的请求。客户端可以使用不同的HTTP功能来告知此信息,并且在其中涉及不同的HttpMessageConverter实现。 ContentNegotiationManager采用了Spring Pick的格式,可以根据不同的策略进行回答。

通过在MappingJackson2XmlHttpMessageConverter上优先StringHttpMessageConverter,您只告诉Spring在“ application / json”上以“文本/纯文本”格式回答,并且它将一直有效,直到客户端指定期望json响应(这是尽管还有其他方法,但通常是通过在请求中设置Accept头来完成的。重要的是,如果客户端将标头设置为“ application / json”,Spring将使用MappingJackson2XmlHttpMessageConverter将Java字符串转换为Json字符串,最后以类似“ {\” abc \”:\“ test \ “}”代替{“ abc”:“ test”}

因此,在这种情况下,每个开发人员面临的真正问题是MappingJackson2XmlHttpMessageConverter将Java字符串转换为Json字符串,在某些情况下,您可能不需要这样做,因为该字符串包含有效的json,需要在不返回的情况下返回该json。修改。这个MessageConverter有一些配置类,但是我没有走这条路,因为我只需要在某些特定端点中返回诸如“ raw” Json之类的字符串(性能是关键驱动因素)。这是恢复我的“方法”的示例:

@RestController
@RequestMapping(value = "test", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public class TestController {

    @RequestMapping(method = RequestMethod.GET, value = "endpoint")
    public JsonObject getSomeJson() {
        return new JsonObject("{\"abc\":\"test\"}");
    }

    private static class JsonObject {
        private String rawJsonValue;
        JsonObject(String rawJsonValue) {
            this.rawJsonValue = rawJsonValue;
        }
        @JsonValue @JsonRawValue
        public String getRawJsonValue() {
            return rawJsonValue;
        }
    }
}

@JsonValue和@JsonRawValue是Jackson注释,它们告诉MappingJackson2XmlHttpMessageConverter将getRawJsonValue方法结果视为JsonObject的Json表示形式,而无需进行任何修改。端点的响应将为{“ abc”:“ test”}