java - Spring 使用 JSONObject 字段反序列化对象

标签 java json spring rest jackson

我在 spring 中反序列化包含 JSON 字段的对象时遇到问题。我有一个 DataTable 数据结构,其中包含字符串字段和一个应包含 JSONObject 的字段:

public class DataTable {

        private String identifier;  
        private String version;         
        private JSONObject content;

        //getters and setters 
}

我希望能够保留该对象并稍后检索它。 当我将这样的 DataTable 对象发布到我的 Controller 并稍后尝试检索它时,我的 content 字段将为空,无论我发布的内容如何:

{
  "identifier": "id1",
  "version": "0.0.1",
  "content": {
    "empty": true
  }
}

jackson 似乎无法正确反序列化 JSONObject 类型字段,而只是将其留空。如何使其正确反序列化字段?

最佳答案

jackson 有 jackson-datatype-json-org模块,它允许我们将 json.org 对象与 POJO 结合起来,或者反序列化为 json.org 对象作为顶级对象。

<dependency>
  <groupId>com.fasterxml.jackson.datatype</groupId>
  <artifactId>jackson-datatype-json-org</artifactId>
  <version>${jackson2.version}</version>
</dependency>

这是一个测试(不要忘记注册 JsonOrgModule)。

public class JsonOrgJacksonTest {

    private final String json =
            "{" +
            "  \"id\": \"one\"," +
            "  \"content\": {" +
            "    \"foo\": \"bar\"," +
            "    \"baz\": \"blah\"" +
            "  }" +
            "}";

    @Test
    public void testJsonOrg() throws Exception {
        ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule(new JsonOrgModule());

        Model model = mapper.readValue(json, Model.class);

        assertThat(model.getId()).isEqualTo("one");
        assertThat(model.getContent().get("foo")).isEqualTo("bar");
        assertThat(model.getContent().get("baz")).isEqualTo("blah");
    }

    public static class Model {
        private String id;
        private JSONObject content;

        public String getId() { return id; }
        public void setId(String id) { this.id = id; }

        public JSONObject getContent() { return content; }
        public void setContent(JSONObject content) { this.content = content; }
    }
}

关于java - Spring 使用 JSONObject 字段反序列化对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52000996/

相关文章:

Maven 项目中的 java.lang.ClassNotFoundException : com. microsoft.sqlserver.jdbc.SQLServerDriver

java - HP ALM 12 REST 不返回 QCSession cookie

java - 使用 Jackson 反序列化扩展 ArrayList 的 Java 对象

spring - NoClassDefFoundError : DefaultLifecycleProcessor$1 when undeplying spring-messaging application

java - 如何在 @Scheduled 注释中指定 PST 时区,该注释应在太平洋标准时间上午 7 点到下午 6 点之间每小时触发一次?

java - 为什么排序采用对象数组?

java - findelements(by.xpath()) 仅返回列表的一个索引

javascript - 如何在 Tizen Studio 中将新信息写入 JSON 文件

javascript - Ajax 响应未定义或奇怪

java - Spring Boot : How to Disable JNDI lookup and use spring. 数据源代替测试?