Ray
Ray

Reputation: 537

spring boot return escaped json

my code

@GetMapping(value = {"/metadata"}, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseStatus(HttpStatus.OK)
@ResponseBody
public String getMetadata() {
    return  dppService.getMetadata();
}

the method getMetadata will just return a json string. it just read data from the json file, and it is in another library can not be changed.

But when call this api, i got the follow reponse:

"{\"Namespace\":\"com.xxx\"...

the json string was escaped. expected:

"{"Namespace":"com.xxx"...

How could i make it return the right json? BTW, our other services also return a json string in the controller, but their response will not be escaped which is so confused for me.

Upvotes: 0

Views: 1357

Answers (2)

Ray
Ray

Reputation: 537

root cause: There is a configuration file in the project:

 @Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    converters.add(new MappingJackson2HttpMessageConverter(jacksonBuilder().build()));
    converters.stream()
            .filter(converter -> converter instanceof MappingJackson2HttpMessageConverter)
            .findFirst()
            .ifPresent(converter -> ((MappingJackson2HttpMessageConverter) converter).setDefaultCharset(UTF_8));
}

This configuration overrite the defualt jackson behavior. There are two ways to solve this issue: 1.Remove this configuration, then it will be the default behavior 2.Add the StringHttpMessageConverter in this configuration, see Ananthapadmanabhan's option2

Upvotes: 0

Ananthapadmanabhan
Ananthapadmanabhan

Reputation: 6206

You could do this two ways:

From what I could understand you are having this issues because you might be returning the json as a string from from the service method dppService.getMetadata() by converting it manually to a string. If so , change that and instead return a POJO class from the service method as well as the controller, spring default jackson converter should automatically convert it to a json when the request is served. (I would suggest you go with this approach)

Another approach (the hacky less desirable one) if you still want to keep returning a string then you could configure the StringMessageConverter like below to accept json:

@Override
public void configureMessageConverters(
        List<HttpMessageConverter<?>> converters) {
    StringHttpMessageConverter stringConverter = new StringHttpMessageConverter(
            Charset.forName("UTF-8"));
    stringConverter.setSupportedMediaTypes(Arrays.asList( //
            MediaType.TEXT_PLAIN, //
            MediaType.TEXT_HTML, //
            MediaType.APPLICATION_JSON));
    converters.add(stringConverter);
}

Upvotes: 1

Related Questions