オブジェクトを JSON 文字列としてデータベースに保存しています。これらの文字列を公開する REST サービスを作成したいと考えています。ただし、メソッドを記述すると、返される文字列の引用符がエスケープされます。たとえば、文字列を返すメソッドを含めました。
@RequestMapping(value = "test", method = RequestMethod.GET)
public @ResponseBody
String getTest() {
return "{\"a\":1, \"b\":\"foo\"}";
}
しかし、ブラウザでこのメソッドを呼び出すと、「{\"a\":1, \"b\":\"foo\"}」が返されます, "b": "foo"}. 戻り値の型が「String」である可能性が高いと思いますが、他に何ができるでしょうか。ラッパー クラスは同じことを行います。
{
"value" : "{\"a\":1, \"b\":\"foo\"}"
}
シリアル化してからオブジェクトを返すこともできますが、それは少しばかげているようです。これは、おそらく私の構成ファイルの関連部分です。
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
super.configureMessageConverters(converters);
converters.add(mappingJacksonHttpMessageConverter());
}
@Bean
MappingJacksonHttpMessageConverter mappingJacksonHttpMessageConverter() {
MappingJacksonHttpMessageConverter mappingJacksonHttpMessageConverter = new MappingJacksonHttpMessageConverter();
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setSerializationInclusion(JsonSerialize.Inclusion.NON_NULL);
mappingJacksonHttpMessageConverter.setObjectMapper(objectMapper);
mappingJacksonHttpMessageConverter.setPrettyPrint(true);
return mappingJacksonHttpMessageConverter;
}
ありがとう
編集: 以下で提案されているように、文字列が二重にエンコードされているようです。私の構成で 2 つのクラスをコメントアウトすると、この問題が修正されます。ただし、オブジェクトを返したい場所が他にもあり、構成する場所がわかっている共通のシリアル化 Bean を介してそれらを実行し続けたいと考えています。したがって、私は自分のオプションを次のように考えています。 a) すべてのシリアル化を自分で行う。すべてのメソッドは文字列を返し、すでに JSON であるメソッドはそれ自体を返し、オブジェクトであるメソッドはすべて JSONUtil.toJson(object) を返します。私はこのアプローチが好きではありませんが、うまくいくことはわかっています。b) 次のようなラッパー クラスを使用します。
public static class Wrapper {
@JsonRawValue
private final String value;
}
これは、実際の意味はありませんが、フロントにぎこちない「値」をもたらします。
基本的に私が欲しいのは @JsonRawValue ですが、プロパティではなく RequestMapping メソッドで機能させる必要があります。考え?意見?他の提案?