如何序列化具有一个json字符串成员的Java对象

时间:2014-08-26 15:06:28

标签: java json jackson

我有一个包含一个成员displayPropsJson的Pojo,它是一个客户端json字符串。在存储在服务器上之前,它使用JSON模式进行验证。 即

public class Item {
    Long id; //23
    String name; //"itemsName"
    String displayPropsJson; // "{\"bold\" : true, \"htmlAllowed\" : true, \"icon\" :\"star.jpg\" }"
}

我想将序列化版本输出displayPropsJson作为displayProps子对象,例如:

{
   "id" :23,
   "name: : "itemsName",
   "displayProps" : {
         "bold" : true,
         "htmlAllowed" : true,
         "icon" : "star.jpg"
    }

}

如何使用输出元素和json字符串作为json的Jackson序列化器来完成此操作? displayPropsJson会有所不同,但总是有效的json。

2 个答案:

答案 0 :(得分:0)

是的我确信可以使用自定义Jackson序列化程序完成此操作。你可以做的另一件事是实现JsonSerializable, }

另一种可能性是实施JsonSerializable interface

最后一种可能性是切换库并使用Google's GSON,这样可以很容易地将对象序列化为json。

答案 1 :(得分:0)

除了创建自定义序列化程序之外,您还可以考虑两个选项。

  • 使用@JsonRawString注释标记字符串字段 应该按原样序列化而不引用字符。
  • 在对象实例(consider value injection)中使ObjectMapper可用,并提供一个getter方法,该方法从json字符串值返回JsonNode反序列化。

这是一个展示两者的例子:

public class JacksonRawString {
    public static class Item {
        final private ObjectMapper mapper;

        public Long id = 23l;
        public String name = "itemsName";
        @JsonRawValue
        public String displayPropsJson = "{\"bold\" : true, \"htmlAllowed\" : true, " +
            "\"icon\" :\"star.jpg\" }";

        public JsonNode getDisplayPropsJson2() throws IOException {
            return mapper.readTree(displayPropsJson);
        }

        public Item(ObjectMapper mapper) {
            this.mapper = mapper;
        }
    }

    public static void main(String[] args) throws JsonProcessingException {
        ObjectMapper mapper = new ObjectMapper();
        System.out.println(
                mapper.writerWithDefaultPrettyPrinter().writeValueAsString(new Item(mapper)));
    }
}

输出:

{
  "id" : 23,
  "name" : "itemsName",
  "displayPropsJson" : {"bold" : true, "htmlAllowed" : true, "icon" :"star.jpg" },
  "displayPropsJson2" : {
    "bold" : true,
    "htmlAllowed" : true,
    "icon" : "star.jpg"
  }
}

请注意,displayPropsJson2获得了相同的输出,因为它被序列化为JsonNode