将JSON内容包含在将由Jackson Mapper序列化的对象中的最佳方法

时间:2016-12-23 11:59:07

标签: java json jackson

我正在使用Jackson Mapper对象将对象编组为JSON。它工作得很好但有时我需要包含一些特定的JSON,它不是要被编组的对象的属性。如果我创建一个像“extraJSON”这样的String属性并将JSON内容放在那里,当该对象被编组时,extraJSON将被转义,因此最终成为JSON中的某种JSON。 我已经尝试创建类型为JsonObject(Java 8 JSON)的属性,但没有正确编组。

关于如何解决这个问题的任何想法?到目前为止,我正在使用Local类(我在运行中创建并使用“Object”类型属性),这是有效的,但这是一个丑陋的解决方法。

1 个答案:

答案 0 :(得分:0)

这是一个非常基本的例子,使用@JsonRawValue将类成员编组为JSON而不是包含转义JSON字符串的属性。不知道是否适用于您的场景,但希望它有所帮助。

package com.spring.jackson.rawjson;

import static org.junit.Assert.assertEquals;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonRawValue;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.Test;

public class RawJsonTest {

    public static class PojoWithRawJsonMember {

        private final String member1;
        private final String member2;
        private final String rawJsonMember1;

        public PojoWithRawJsonMember(String member1, String member2, String rawJsonMember1) {
            this.member1 = member1;
            this.member2 = member2;
            this.rawJsonMember1 = rawJsonMember1;
        }

        @JsonProperty("member1")
        public String getMember1() {
            return member1;
        }

        @JsonProperty("member2")
        public String getMember2() {
            return member2;
        }

        @JsonRawValue
        public String getRawJsonMember1() {
            return rawJsonMember1;
        }
    }

    @Test
    public void jsonRaw_shouldMarshalRawJson() throws Exception {
        ObjectMapper mapper = new ObjectMapper();
        PojoWithRawJsonMember thingToMarshal = new PojoWithRawJsonMember("value1", "value2", "{\"key\":\"value\"}");
        String marshalled = mapper.writeValueAsString(thingToMarshal);
        assertEquals("{\"rawJsonMember1\":{\"key\":\"value\"},\"member1\":\"value1\",\"member2\":\"value2\"}",
                marshalled);
    }
}

@JsonRawValue在序列化时有效。就我对JavaDocs的理解而言,它不适用于反序列化。