Jackson没有很好地打印由@JsonRawValue注解的值吗?

d4so4syb  于 2022-11-09  发布在  其他
关注(0)|答案(1)|浏览(139)

我将JSON存储在数据库中,并希望在API响应中原样包含此JSON,而不在序列化数据之前进行反序列化。数据本身驻留在一个 Package 器对象中。在序列化此 Package 器时,数据库中的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"
}
  }
}

虽然我期望Jackson给我以下输出:

{
  "wrapper" : {
    "data" : {
      "raw" : "test"
    }
  }
}

有没有办法“修复”用@JsonRawValue注解的原始数据的缩进?

to94eoyn

to94eoyn1#

使用下面的代码,您的测试可能会通过:

Object json = mapper.readValue(input, Object.class);
String indented = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(json);

你可以检查stackoverflow问题和它自己的答案,我已经写了上面的代码来自,从接受的答案:Convert JSON String to Pretty Print JSON output using Jackson

相关问题