jackson 自定义序列化

素颜马尾好姑娘i 2022-05-21 02:53 461阅读 0赞

对于一直用gson的人来说,如果单独用jackson,真是麻烦了,但还是得小结下了:
先来看下如何自定义把某个对象序列化为json:

先是对象:

Java代码 收藏代码

  1. public class User {
  2. public int id;
  3. public String name;
  4. }
  5. public class Item {
  6. public int id;
  7. public String itemName;
  8. public User owner;
  9. }

JACKSON一般的使用很容易,如;
Item myItem = new Item(1, “theItem”, new User(2, “theUser”));
String serialized = new ObjectMapper().writeValueAsString(myItem);
结果为:
{
“id”: 1,
“itemName”: “theItem”,
“owner”: {
“id”: 2,
“name”: “theUser”
}
}

如果要输出为如下的样子,比如;
{
“id”: 25,
“itemName”: “FEDUfRgS”,
“owner”: 15
}

则要自定义了,要继承JsonSerializer类,如下:

Java代码 收藏代码

  1. public class ItemSerializer extends JsonSerializer {
  2. @Override
  3. public void serialize(Item value, JsonGenerator jgen, SerializerProvider provider)
  4. throws IOException, JsonProcessingException {
  5. jgen.writeStartObject();
  6. jgen.writeNumberField(“id”, value.id);
  7. jgen.writeStringField(“itemName”, value.itemName);
  8. jgen.writeNumberField(“owner”, value.owner.id);
  9. jgen.writeEndObject();
  10. }
  11. }

然后

Java代码 收藏代码

  1. Item myItem = new Item(1, “theItem”, new User(2, “theUser”));
  2. ObjectMapper mapper = new ObjectMapper();
  3. SimpleModule module = new SimpleModule();
  4. module.addSerializer(Item.class, new ItemSerializer());
  5. mapper.registerModule(module);
  6. String serialized = mapper.writeValueAsString(myItem);
  1. 看,相当复杂,然后看有无办法简单点,其实是有的哦;方法为:

Java代码 收藏代码

  1. @JsonSerialize(using = ItemSerializer.class)
  2. public class Item {
  3. }

就是使用注解@JsonSerialize,然后:

Java代码 收藏代码

  1. Item myItem = new Item(1, “theItem”, new User(2, “theUser”));
  2. String serialized = new ObjectMapper().writeValueAsString(myItem);

接下来看如何反序列化了,
同样,要反序列化的两个pojo为:

Java代码 收藏代码

  1. public class User {
  2. public int id;
  3. public String name;
  4. }
  5. public class Item {
  6. public int id;
  7. public String itemName;
  8. public User owner;
  9. }

反序列化代码为:
Item itemWithOwner = new ObjectMapper().readValue(json, Item.class);

如果要自定义反序列化,比如要反序列化的JSON为;
{
“id”: 1,
“itemName”: “theItem”,
“owner”: 2
}

则上面这样会报错:
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:
Unrecognized field “createdBy” (class org.baeldung.jackson.dtos.Item),
not marked as ignorable (3 known properties: “id”, “owner”, “itemName”])
at [Source: java.io.StringReader@53c7a917; line: 1, column: 43]
(through reference chain: org.baeldung.jackson.dtos.Item[“createdBy”])

代码:

Java代码 收藏代码

  1. public class ItemDeserializer extends JsonDeserializer {
  2. @Override
  3. public Item deserialize(JsonParser jp, DeserializationContext ctxt)
  4. throws IOException, JsonProcessingException {
  5. JsonNode node = jp.getCodec().readTree(jp);
  6. int id = (Integer) ((IntNode) node.get(“id”)).numberValue();
  7. String itemName = node.get(“itemName”).asText();
  8. int userId = (Integer) ((IntNode) node.get(“id”)).numberValue();
  9. return new Item(id, itemName, new User(userId, null));
  10. }
  11. }
  12. ObjectMapper mapper = new ObjectMapper();
  13. SimpleModule module = new SimpleModule();
  14. module.addDeserializer(Item.class, new ItemDeserializer());
  15. mapper.registerModule(module);
  16. Item readValue = mapper.readValue(json, Item.class);

也可以用注解:
@JsonDeserialize(using = ItemDeserializer.class)
public class Item {

}

发表评论

表情:
评论列表 (有 0 条评论,461人围观)

还没有评论,来说两句吧...

相关阅读