17

SpringMVC プロジェクトで JSON 用の新しい Java API (JSR 353) を使用しています。

アイデアは、Json データの一部を生成し、それをクライアントに返すことです。私が持っているコントローラーは、次のようになります。

@RequestMapping("/test")
@ResponseBody
public JsonObject test() {
        JsonObject result = Json.createObjectBuilder()
                .add("name", "Dade")
                .add("age", 23)
                .add("married", false)
                .build();
        return result;
    }

これにアクセスすると、JSON の期待される表現を取得する代わりに、次のようになります。

{"name":{"chars":"Dade","string":"Dade","valueType":"STRING"},"age":{"valueType":"NUMBER","integral":true},"married":{"valueType":"FALSE"}}

どうしてこれなの?何が起こっている?そして、期待されるJSONを適切に返すにはどうすればよいですか?

4

2 に答える 2

1

Sotirios Delimanolis からの回答は確かに機能しますが、私の場合、適切な HttpMessageConverter の順序が整っていることを確認する必要がありました。これは、JodaTime の値も ISO 8601 形式に変換する必要があったためです。このカスタム WebMvcConfigurerAdapter 構成は私にとってはうまくいきました:

@Configuration
public class WebConfiguration extends WebMvcConfigurerAdapter {

@SuppressWarnings("UnusedDeclaration")
private static final Logger log = LoggerFactory.getLogger(WebConfiguration.class);

public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    log.info("Configuring jackson ObjectMapper");
    final MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
    final ObjectMapper objectMapper = new ObjectMapper();

    //configure Joda serialization
    objectMapper.registerModule(new JodaModule());
    objectMapper.configure(com.fasterxml.jackson.databind.SerializationFeature.
            WRITE_DATES_AS_TIMESTAMPS, false);

    // Other options such as how to deal with nulls or identing...
    objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
    objectMapper.enable(SerializationFeature.INDENT_OUTPUT);
    converter.setObjectMapper(objectMapper);

    StringHttpMessageConverter stringHttpMessageConverter = new StringHttpMessageConverter();
    /*
    StringHttpMessageConverter must appear first in the list so that Spring has a chance to use
     it for Spring RestController methods that return simple String. Otherwise, it will use
      MappingJackson2HttpMessageConverter and clutter the response with escaped quotes and such
     */
    converters.add(stringHttpMessageConverter);
    converters.add(converter);
    super.configureMessageConverters(converters);
}
}
于 2016-12-09T19:02:46.883 に答える