当前位置: 首页 > 知识库问答 >
问题:

Jackson不漂亮地打印由@JsonRawValue注释的值吗?

景永望
2023-03-14

我将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"
}
  }
}

我希望jackson能给我以下输出:

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

有什么方法可以“修复”用@JsonRawValue注释的原始数据的缩进?

共有1个答案

贝礼骞
2023-03-14

也许通过以下代码,您的测试将通过:

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

您可以检查stackoverflow问题及其自己的答案,我编写的upper代码就是从这些答案中得出的,这些答案来自公认的答案:使用Jackson将JSON字符串转换为漂亮的打印JSON输出

 类似资料:
  • 问题内容: 现在,我有一个实例,并希望使用漂亮的JSON 来获取一个。我所有的Google搜索结果都提供了Jackson 1.x的实现方法,而我似乎找不到使用2.2的正确,不建议使用的方法。即使我不认为代码对于此问题绝对必要,这也是我现在拥有的: 问题答案: 您可以启用通过设置漂亮的印刷上的,如下所示:

  • 我正在寻找一种漂亮的方法来打印地图。 <代码>贴图。toString()给我:

  • 问题内容: 我有一个字符串,它表示要打印的非缩进XML。例如: 应该变成: 语法高亮不是必需的。为了解决该问题,我首先将XML转换为添加回车符和空格,然后使用pre标记输出XML。为了添加新行和空白,我编写了以下函数: 然后,我像这样调用该函数: 这对我来说很好用,但是当我编写上一个函数时,我认为必须有更好的方法。所以我的问题是,给定XML字符串以将其漂亮地打印在html页面中,您是否知道更好的方

  • 问题内容: 我正在寻找一种漂亮地打印的好方法。 给我: 我希望地图输入值具有更大的自由度,并且正在寻找更多类似这样的东西: 我写了这段代码: 但是我敢肯定,有一种更优雅,更简洁的方法可以做到这一点。 问题答案: 或将您的逻辑放在一个整洁的小班上。 用法: 注意:您也可以将该逻辑放入实用程序方法中。

  • 问题内容: 我试图使我的数据集与此示例相对应: 我有一个名称和与那些名称可以引用的特定实体相对应的唯一字母数字值,我们将这些条目称为“ ID”。 因此,例如,可能与ID有关,因为这是一个非常具体的参考,因此没有很多广为人知的具有该名称的图形。然而,可能被附加到,和,引用也许是男人,啤酒和灌木,没有特定的顺序。 看起来像这样(实际的更大): 使用杰克逊,我这样尝试: 但这似乎是错误的,因为我的输出全

  • 问题内容: Go中有类似Ruby的东西吗? 例如,在Ruby中,您可以编写: 输出将是: 我能找到的最接近的东西是 问题答案: 如果您的目标是避免导入第三方软件包,则另一个选择是使用json.MarshalIndent: 输出: 工作示例:http : //play.golang.org/p/SNdn7DsBjy