Jackson 不漂亮打印由@JsonRawValue 注释的值吗?
Does Jackson not pretty print values annotated by @JsonRawValue?
我将 JSON 存储在我的数据库中,并希望按原样将此 JSON 包含在 API 响应中,而无需在序列化数据之前进行反序列化。
数据本身驻留在包装器对象中。序列化此包装器时,我的数据库中的 JSON 似乎没有与其余数据一起打印得很好,给出的响应看起来很奇怪。
我写了一些示例代码来概述我的问题:
import com.fasterxml.jackson.annotation.JsonRawValue;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThat;
public class JacksonTest {
private static final String EXPECTED_OUTPUT = "{\n" +
" \"wrapper\" : {\n" +
" \"data\" : {\n" +
" \"raw\" : \"test\"\n" +
" }\n" +
" }\n" +
"}";
private static final String RAW_JSON = "{\n" +
" \"raw\" : \"test\"\n" +
"}";
static class Pojo {
@JsonRawValue
private final String data;
public Pojo(String data) {
this.data = data;
}
public String getData() {
return data;
}
}
static class Wrapper {
private final Pojo wrapper;
public Wrapper() {
wrapper = new Pojo(RAW_JSON);
}
@SuppressWarnings("unused")
public Pojo getWrapper() {
return wrapper;
}
}
@Test
void shouldEqual() throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper().enable(SerializationFeature.INDENT_OUTPUT);
String output = mapper.writeValueAsString(new Wrapper());
assertThat(output).isEqualTo(EXPECTED_OUTPUT);
}
}
此测试失败,输出如下:
{
"wrapper" : {
"data" : {
"raw" : "test"
}
}
}
虽然我希望杰克逊给我以下输出:
{
"wrapper" : {
"data" : {
"raw" : "test"
}
}
}
有什么方法可以“修复”用 @JsonRawValue
注释的原始数据的缩进吗?
也许使用以下代码您的测试将通过:
Object json = mapper.readValue(input, Object.class);
String indented = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(json);
您可以从已接受的答案中检查我上面编写的代码来自的 Whosebug 问题及其自己的答案:
Convert JSON String to Pretty Print JSON output using Jackson
我将 JSON 存储在我的数据库中,并希望按原样将此 JSON 包含在 API 响应中,而无需在序列化数据之前进行反序列化。 数据本身驻留在包装器对象中。序列化此包装器时,我的数据库中的 JSON 似乎没有与其余数据一起打印得很好,给出的响应看起来很奇怪。
我写了一些示例代码来概述我的问题:
import com.fasterxml.jackson.annotation.JsonRawValue;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThat;
public class JacksonTest {
private static final String EXPECTED_OUTPUT = "{\n" +
" \"wrapper\" : {\n" +
" \"data\" : {\n" +
" \"raw\" : \"test\"\n" +
" }\n" +
" }\n" +
"}";
private static final String RAW_JSON = "{\n" +
" \"raw\" : \"test\"\n" +
"}";
static class Pojo {
@JsonRawValue
private final String data;
public Pojo(String data) {
this.data = data;
}
public String getData() {
return data;
}
}
static class Wrapper {
private final Pojo wrapper;
public Wrapper() {
wrapper = new Pojo(RAW_JSON);
}
@SuppressWarnings("unused")
public Pojo getWrapper() {
return wrapper;
}
}
@Test
void shouldEqual() throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper().enable(SerializationFeature.INDENT_OUTPUT);
String output = mapper.writeValueAsString(new Wrapper());
assertThat(output).isEqualTo(EXPECTED_OUTPUT);
}
}
此测试失败,输出如下:
{
"wrapper" : {
"data" : {
"raw" : "test"
}
}
}
虽然我希望杰克逊给我以下输出:
{
"wrapper" : {
"data" : {
"raw" : "test"
}
}
}
有什么方法可以“修复”用 @JsonRawValue
注释的原始数据的缩进吗?
也许使用以下代码您的测试将通过:
Object json = mapper.readValue(input, Object.class);
String indented = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(json);
您可以从已接受的答案中检查我上面编写的代码来自的 Whosebug 问题及其自己的答案: Convert JSON String to Pretty Print JSON output using Jackson