jackson中自定義處理序列化和反序列化
阿新 • • 發佈:2018-02-07
public turn ali fast col ast mar 繼承 con
http://jackyrong.iteye.com/blog/2005323
**********************************************
對於一直用gson的人來說,如果單獨用jackson,真是麻煩了,但還是得小結下了:
先來看下如何自定義把某個對象序列化為json:
先是對象:
Java代碼
public class User { public int id; public String name; } public class Item { public int id;public String itemName; public User owner; }
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類,如下:
public class ItemSerializer extends JsonSerializer<Item> { @Override public void serialize(Item value, JsonGenerator jgen, SerializerProvider provider)throws IOException, JsonProcessingException { jgen.writeStartObject(); jgen.writeNumberField("id", value.id); jgen.writeStringField("itemName", value.itemName); jgen.writeNumberField("owner", value.owner.id); jgen.writeEndObject(); } }
然後
Item myItem = new Item(1, "theItem", new User(2, "theUser")); ObjectMapper mapper = new ObjectMapper(); SimpleModule module = new SimpleModule(); module.addSerializer(Item.class, new ItemSerializer()); mapper.registerModule(module); String serialized = mapper.writeValueAsString(myItem);
看,相當復雜,然後看有無辦法簡單點,其實是有的哦;方法為:
@JsonSerialize(using = ItemSerializer.class) public class Item { ... }
就是使用註解@JsonSerialize,然後:
Item myItem = new Item(1, "theItem", new User(2, "theUser")); String serialized = new ObjectMapper().writeValueAsString(myItem);
接下來看如何反序列化了,
同樣,要反序列化的兩個pojo為:
public class User { public int id; public String name; } public class Item { public int id; public String itemName; public User owner; }
反序列化代碼為:
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"])
代碼:
public class ItemDeserializer extends JsonDeserializer<Item> { @Override public Item deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException { JsonNode node = jp.getCodec().readTree(jp); int id = (Integer) ((IntNode) node.get("id")).numberValue(); String itemName = node.get("itemName").asText(); int userId = (Integer) ((IntNode) node.get("id")).numberValue(); return new Item(id, itemName, new User(userId, null)); } } ObjectMapper mapper = new ObjectMapper(); SimpleModule module = new SimpleModule(); module.addDeserializer(Item.class, new ItemDeserializer()); mapper.registerModule(module); Item readValue = mapper.readValue(json, Item.class);
也可以用註解:
@JsonDeserialize(using = ItemDeserializer.class) public class Item { ... }
jackson中自定義處理序列化和反序列化