版本:
jackson-databind-2.8.8.1.jar
jackson-core-2.8.8.jar
jackson-annotations-2.8.8.jar
1.基本
字符串和对象间的转换
private static void object2String() throws JsonProcessingException { People p = new People(); p.id = 101; p.name = "rensanning101"; ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(p); System.out.println(json); // {"id":101,"name":"rensanning101"} }
private static void string2Object() throws JsonParseException, JsonMappingException, IOException { String json = "{\"id\":102, \"name\":\"rensanning102\"}"; ObjectMapper mapper = new ObjectMapper(); People p = mapper.readValue(json, People.class); System.out.println(p); // People [id=102, name=rensanning102] }
static class People { public int id; public String name; @Override public String toString() { return "People [id=" + id + ", name=" + name +"]"; } }
字符串和数组间的转换
private static void objectArray2String() throws JsonProcessingException { People p1 = new People(); p1.id = 103; p1.name = "rensanning103"; People p2 = new People(); p2.id = 104; p2.name = "rensanning104"; People[] p = new People[2]; p[0] = p1; p[1] = p2; ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(p); System.out.println(json); // [{"id":103,"name":"rensanning103"},{"id":104,"name":"rensanning104"}] }
private static void string2ObjectArray() throws JsonParseException, JsonMappingException, IOException { String json = "[{\"id\":105,\"name\":\"rensanning105\"},{\"id\":106,\"name\":\"rensanning106\"}]"; ObjectMapper mapper = new ObjectMapper(); People[] pp = mapper.readValue(json, People[].class); System.out.println(pp); }
字符串和集合间的转换
private static void objectList2String() throws JsonProcessingException { People p1 = new People(); p1.id = 107; p1.name = "rensanning107"; People p2 = new People(); p2.id = 108; p2.name = "rensanning108"; List<People> p = new ArrayList<People>(); p.add(p1); p.add(p2); ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(p); System.out.println(json); // [{"id":107,"name":"rensanning107"},{"id":108,"name":"rensanning108"}] }
private static void string2ObjectList() throws JsonParseException, JsonMappingException, IOException { String json = "[{\"id\":109,\"name\":\"rensanning109\"},{\"id\":110,\"name\":\"rensanning110\"}]"; ObjectMapper mapper = new ObjectMapper(); @SuppressWarnings("unchecked") List<People> pp = mapper.readValue(json, List.class); System.out.println(pp); // [{id=109, name=rensanning109}, {id=110, name=rensanning110}] }
其他
private static void readValueFromFile() throws JsonParseException, JsonMappingException, IOException { String path = new File(".").getAbsoluteFile().getParent(); File file = new File(path +"/people.json"); ObjectMapper mapper = new ObjectMapper(); People people = mapper.readValue(file, People.class); System.out.println(people); // People [id=111, name=rensanning111] }
引用
{"id":111,"name":"rensanning111"}
private static void object2StringWithProtectedField() throws JsonProcessingException { PeopleField p = new PeopleField(); p.id = 112; p.name = "rensanning112"; p.setGender("male"); ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(p); System.out.println(json); // {"id":112,"name":"rensanning112","gender":"male"} }
static class PeopleField { // public字段不需要Getter/Setter public int id; public String name; // protected/private字段需要Getter/Setter protected String gender; public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } @Override public String toString() { return "PeopleField [id=" + id + ", name=" + name + ", gender=" + gender +"]"; } }
2.设置
SerializationFeature
private static void settingsSerial() throws JsonProcessingException { People p = new People(); p.id = 201; p.name = "rensanning201"; ObjectMapper mapper = new ObjectMapper(); // 通过enable() / disable()方法设置 // https://github.com/FasterXML/jackson-databind/wiki/Serialization-Features mapper.enable(SerializationFeature.INDENT_OUTPUT); String json = mapper.writeValueAsString(p); System.out.println(json); // { // "id" : 201, // "name" : "rensanning201" // } }
DeserializationFeature
private static void settingsDeserial() throws JsonParseException, JsonMappingException, IOException { String json = "{\"id\":202, \"name\":\"rensanning202\", \"ttt\":\"123456\"}"; ObjectMapper mapper = new ObjectMapper(); // 通过enable() / disable()方法设置 // https://github.com/FasterXML/jackson-databind/wiki/Deserialization-Features // 如果没有以下设置会报错:UnrecognizedPropertyException: Unrecognized field "ttt" mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); People p = mapper.readValue(json, People.class); System.out.println(p); // People [id=202, name=rensanning202] }
3.类型
TypeReference
private static void deserialTypeRef() throws JsonParseException, JsonMappingException, IOException { String json = "[{\"id\":301, \"name\":\"rensanning301\"}, {\"id\":302, \"name\":\"rensanning302\"}]"; ObjectMapper mapper = new ObjectMapper(); TypeReference<List<People>> valueTypeRef = new TypeReference<List<People>>() {}; List<People> list = mapper.readValue(json, valueTypeRef); System.out.println(list); // [People [id=301, name=rensanning301], People [id=302, name=rensanning302]] }
4.注解
@JsonProperty
private static void annotationJsonProperty() throws JsonProcessingException { PeopleJsonProperty p = new PeopleJsonProperty(); p.id = 401; p.name = "rensanning 401 JsonProperty"; ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(p); System.out.println(json); // {"id":401,"newName":"rensanning 401 JsonProperty"} }
static class PeopleJsonProperty { public int id; @JsonProperty("newName") public String name; @Override public String toString() { return "PeopleJsonProperty [id=" + id + ", name=" + name +"]"; } }
@JsonIgnore
private static void annotationJsonIgnore() throws JsonProcessingException { PeopleJsonIgnore p = new PeopleJsonIgnore(); p.id = 402; p.name = "rensanning 402 JsonIgnore"; ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(p); System.out.println(json); // {"id":402} }
static class PeopleJsonIgnore { public int id; @JsonIgnore public String name; @Override public String toString() { return "PeopleJsonIgnore [id=" + id + ", name=" + name +"]"; } }
@JsonIgnoreProperties
private static void annotationJsonIgnoreProperties() throws IOException { PeopleJsonIgnoreProperties p = new PeopleJsonIgnoreProperties(); p.id = 404; p.name = "rensanning 404 JsonIgnoreProperties"; p.age = 36; ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(p); System.out.println(json); // {"name":"rensanning 404 JsonIgnoreProperties"} // ignoreUnknown=true String json2 = "{\"id\":405, \"name\":\"rensanning405\", \"ttt\":\"123456\"}"; ObjectMapper mapper2 = new ObjectMapper(); PeopleIgnoreUnknown p2 = mapper2.readValue(json2, PeopleIgnoreUnknown.class); System.out.println(p2); // PeopleIgnoreUnknown [id=405, name=rensanning405] }
@JsonIgnoreProperties({"id", "age"}) static class PeopleJsonIgnoreProperties { public int id; public String name; public int age; @Override public String toString() { return "PeopleJsonIgnoreProperties [id=" + id + ", name=" + name + ", age=" + age +"]"; } }
@JsonIgnoreProperties(ignoreUnknown=true) static class PeopleIgnoreUnknown { public int id; public String name; @Override public String toString() { return "PeopleIgnoreUnknown [id=" + id + ", name=" + name +"]"; } }
@JsonCreator
private static void annotationJsonCreator() throws JsonParseException, JsonMappingException, IOException { String json = "{\"id\":406, \"name\":\"rensanning 406 JsonCreator\"}"; // 默认采用无参构造函数。 ObjectMapper mapper = new ObjectMapper(); // 如果没有无参构造函数需要用@JsonCreator PeopleJsonCreator p1 = mapper.readValue(json, PeopleJsonCreator.class); System.out.println(p1); // PeopleJsonCreator [id=406, name=rensanning 406 JsonCreator] // @JsonCreator不局限于构造函数 PeopleJsonCreatorFactory p2 = mapper.readValue(json, PeopleJsonCreatorFactory.class); System.out.println(p2); // PeopleJsonCreatorFactory [id=406, name=rensanning 406 JsonCreator] }
static class PeopleJsonCreator { public int id; public String name; @JsonCreator private PeopleJsonCreator(@JsonProperty("id") int id, @JsonProperty("name") String name) { this.id = id; this.name = name; } @Override public String toString() { return "PeopleJsonCreator [id=" + id + ", name=" + name +"]"; } }
static class PeopleJsonCreatorFactory { public int id; public String name; @JsonCreator public static PeopleJsonCreatorFactory create(@JsonProperty("id") int id, @JsonProperty("name") String name) { return new PeopleJsonCreatorFactory(id, name); } private PeopleJsonCreatorFactory(int id, String name) { this.id = id; this.name = name; } @Override public String toString() { return "PeopleJsonCreatorFactory [id=" + id + ", name=" + name +"]"; } }
@JsonAnyGetter
private static void annotationJsonAnyGetter() throws JsonProcessingException { PepoleJsonAnyGetter p = new PepoleJsonAnyGetter(); p.id = 407; p.name = "rensanning 407 JsonAnyGetter"; p.properties.put("attr1", "val1"); p.properties.put("attr2", "val2"); ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(p); System.out.println(json); // {"id":407,"name":"rensanning 407 JsonAnyGetter","attr2":"val2","attr1":"val1"} }
static class PepoleJsonAnyGetter { public int id; public String name; private Map<String, String> properties = new HashMap<String, String>(); @JsonAnyGetter public Map<String, String> getProperties() { return properties; } }
@JsonAnySetter
private static void annotationJsonAnySetter() throws JsonProcessingException, IOException { String json = "{\"id\":408, \"name\":\"rensanning 408 JsonAnySetter\",\"attr2\":\"val2\",\"attr1\":\"val1\"}"; ObjectMapper mapper = new ObjectMapper(); PepoleJsonAnySetter p = mapper.readValue(json, PepoleJsonAnySetter.class); System.out.println(p); }
static class PepoleJsonAnySetter { public int id; public String name; private Map<String, String> properties = new HashMap<String, String>(); @JsonAnySetter public void add(String key, String value) { properties.put(key, value); } }
@JsonSerialize
private static void annotationJsonSerialize() throws JsonProcessingException, ParseException { SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); String toParse = "2017-05-03 12:30:00"; Date date = df.parse(toParse); PeopleJsonSerialize p = new PeopleJsonSerialize(); p.id = 409; p.name = "rensanning 409 JsonSerialize"; p.eventDate = date; ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(p); System.out.println(json); // {"id":409,"name":"rensanning 409 JsonSerialize","eventDate":"2017-05-03 12:30:00"} }
static class PeopleJsonSerialize { public int id; public String name; @JsonSerialize(using = CustomDateSerializer.class) public Date eventDate; } @SuppressWarnings("serial") static class CustomDateSerializer extends StdSerializer<Date> { private static SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); public CustomDateSerializer() { this(null); } public CustomDateSerializer(Class<Date> t) { super(t); } @Override public void serialize(Date value, JsonGenerator gen, SerializerProvider arg2) throws IOException, JsonProcessingException { gen.writeString(formatter.format(value)); } }
@JsonDeserialize
private static void annotationJsonDeserialize() throws JsonParseException, JsonMappingException, IOException { String json = "{\"id\":410, \"name\":\"rensanning 410 JsonDeserialize\",\"eventDate\":\"20-12-2014 02:30:00\"}"; ObjectMapper mapper = new ObjectMapper(); PeopleJsonDeserialize p = mapper.readValue(json, PeopleJsonDeserialize.class); System.out.println(p); }
static class PeopleJsonDeserialize { public int id; public String name; @JsonDeserialize(using = CustomDateDeserializer.class) public Date eventDate; } @SuppressWarnings("serial") static class CustomDateDeserializer extends StdDeserializer<Date> { private static SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss"); public CustomDateDeserializer() { this(null); } public CustomDateDeserializer(Class<?> vc) { super(vc); } @Override public Date deserialize(JsonParser jsonparser, DeserializationContext context) throws IOException { String date = jsonparser.getText(); try { return formatter.parse(date); } catch (ParseException e) { throw new RuntimeException(e); } } }
@JsonView
private static void annotationJsonView() throws JsonProcessingException { PeopleJsonView item = new PeopleJsonView(); item.id = 412; item.name = "rensanning 412 JsonView"; item.address = "china dalian"; ObjectMapper mapper = new ObjectMapper(); String result1 = mapper.writerWithView(Views.Public.class).writeValueAsString(item); System.out.println(result1); // {"id":412,"name":"rensanning 412 JsonView"} String result2 = mapper.writerWithView(Views.Internal.class).writeValueAsString(item); System.out.println(result2); // {"id":412,"name":"rensanning 412 JsonView","address":"china dalian"} }
static class Views { public static class Public { } public static class Internal extends Public { } } static class PeopleJsonView { @JsonView(Views.Public.class) public int id; @JsonView(Views.Public.class) public String name; @JsonView(Views.Internal.class) public String address; }
5.类信息
JsonTypeInfo.Id.CLASS
private static void jsonTypeInfoId() throws JsonProcessingException { PeopleInfoId p = new PeopleInfoId(); p.id = 501; p.name = "rensanning 501 JsonTypeInfoId"; ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(p); System.out.println(json); // {"@class":"com.rensanning.jackson.Startup$PeopleInfoId","id":501,"name":"rensanning 501 JsonTypeInfoId"} }
@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS) static class PeopleInfoId { public int id; public String name; @Override public String toString() { return "PeopleInfoId [id=" + id + ", name=" + name +"]"; } }
JsonTypeInfo.Id.CUSTOM
private static void jsonTypeInfoCustomId() throws JsonProcessingException { PeopleInfoCustomId p = new PeopleInfoCustomId(); p.id = 502; p.name = "rensanning 502 JsonTypeInfoCustomId"; ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(p); System.out.println(json); // {"CustomIdKey":"Startup$PeopleInfoCustomId","id":502,"name":"rensanning 502 JsonTypeInfoCustomId"} }
@JsonTypeInfo(use = JsonTypeInfo.Id.CUSTOM, include = JsonTypeInfo.As.PROPERTY, property = "CustomIdKey") @JsonTypeIdResolver(PeopleInfoCustomIdResolver.class) static class PeopleInfoCustomId { public int id; public String name; @Override public String toString() { return "PeopleInfoCustomId [id=" + id + ", name=" + name +"]"; } } static class PeopleInfoCustomIdResolver implements TypeIdResolver { private static final String COMMAND_PACKAGE = "com.rensanning.jackson"; private JavaType mBaseType; @Override public void init(JavaType baseType) { mBaseType = baseType; } @Override public Id getMechanism() { return Id.CUSTOM; } @Override public String idFromValue(Object obj) { return idFromValueAndType(obj, obj.getClass()); } @Override public String idFromBaseType() { return idFromValueAndType(null, mBaseType.getRawClass()); } @Override public String idFromValueAndType(Object obj, Class<?> clazz) { String name = clazz.getName(); if (name.startsWith(COMMAND_PACKAGE)) { return name.substring(COMMAND_PACKAGE.length() + 1); } throw new IllegalStateException("class " + clazz + " is not in the package " + COMMAND_PACKAGE); } @Override public String getDescForKnownTypeIds() { return null; } @Override public JavaType typeFromId(DatabindContext arg0, String type) throws IOException { Class<?> clazz; String clazzName = COMMAND_PACKAGE + "." + type; try { clazz = ClassUtil.findClass(clazzName); } catch (ClassNotFoundException e) { throw new IllegalStateException("cannot find class '" + clazzName + "'"); } return TypeFactory.defaultInstance().constructSpecializedType(mBaseType, clazz); } }
JsonTypeInfo.As.WRAPPER_OBJECT
private static void jsonTypeInfoAs() throws JsonProcessingException { PeopleInfoAs p = new PeopleInfoAs(); p.id = 503; p.name = "rensanning 503 jsonTypeInfoAs"; ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(p); System.out.println(json); // {"com.rensanning.jackson.Startup$PeopleInfoAs":{"id":503,"name":"rensanning 503 jsonTypeInfoAs"}} }
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.WRAPPER_OBJECT) static class PeopleInfoAs { public int id; public String name; @Override public String toString() { return "PeopleInfoAs [id=" + id + ", name=" + name +"]"; } }
JsonTypeInfo.As.EXTERNAL_PROPERTY
private static void jsonTypeInfoAsExternal() throws JsonProcessingException { People p = new People(); p.id = 504; p.name = "rensanning 504 JsonTypeInfoAsExternal"; ExternalClass dto = new ExternalClass(); dto.people = p; ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(dto); System.out.println(json); // {"people":{"id":504,"name":"rensanning 504 JsonTypeInfoAsExternal"},"@class":"com.rensanning.jackson.Startup$People"} }
static class ExternalClass { @JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.EXTERNAL_PROPERTY) public People people; }
6.抽象类
@JsonTypeInfo(use=Id.CLASS)
private static void abstractClassID() throws IOException { P11 p11 = new P11(); p11.id = 601; p11.name = "rensanning 601"; P12 p12 = new P12(); p12.id = 602; p12.name = "rensanning 602"; Animal1 dto = new Animal1(); dto.list.add(p11); dto.list.add(p12); ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(dto); System.out.println(json); // {"list":[{"@class":"com.rensanning.jackson.Startup$P11","id":601,"name":"rensanning 601"},{"@class":"com.rensanning.jackson.Startup$P12","id":602,"name":"rensanning 602"}]} dto = (Animal1) mapper.readValue(json, Animal1.class); System.out.println(dto); }
@JsonTypeInfo(use=Id.CLASS) static abstract class Base1 { public int id; public String name; } static class P11 extends Base1 { @Override public String toString() { return "P11 [id=" + id + ", name=" + name + "]"; } } static class P12 extends Base1 { @Override public String toString() { return "P12 [id=" + id + ", name=" + name + "]"; } } static class Animal1 { public List<Base1> list = new ArrayList<Base1>(); }
mapper.enableDefaultTyping();
private static void abstractClassType() throws IOException { P21 p21 = new P21(); p21.id = 603; p21.name = "rensanning 603"; P22 p22 = new P22(); p22.id = 604; p22.name = "rensanning 604"; Animal2 dto = new Animal2(); dto.list.add(p21); dto.list.add(p22); ObjectMapper mapper = new ObjectMapper(); mapper.enableDefaultTyping(); String json = mapper.writeValueAsString(dto); System.out.println(json); // {"list":["java.util.ArrayList",[["com.rensanning.jackson.Startup$P21",{"id":603,"name":"rensanning 603"}],["com.rensanning.jackson.Startup$P22",{"id":604,"name":"rensanning 604"}]]]} dto = (Animal2) mapper.readValue(json, Animal2.class); System.out.println(dto); }
static abstract class Base2 { public int id; public String name; } static class P21 extends Base2 { @Override public String toString() { return "P21 [id=" + id + ", name=" + name + "]"; } } static class P22 extends Base2 { @Override public String toString() { return "P22 [id=" + id + ", name=" + name + "]"; } } static class Animal2 { public List<Base2> list = new ArrayList<Base2>(); }
@JsonSubTypes
private static void abstractClassSubType() throws IOException { P31 p31 = new P31(); p31.id = 605; p31.name = "rensanning 605"; P32 p32 = new P32(); p32.id = 606; p32.name = "rensanning 606"; Animal3 dto = new Animal3(); dto.list.add(p31); dto.list.add(p32); ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(dto); System.out.println(json); // {"list":[{"type":"P31","id":605,"name":"rensanning 605"},{"type":"P32","id":606,"name":"rensanning 606"}]} dto = (Animal3) mapper.readValue(json, Animal3.class); System.out.println(dto); }
@JsonTypeInfo( use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type") @JsonSubTypes({ @Type(value = P31.class, name = "P31"), @Type(value = P32.class, name = "P32") }) static abstract class Base3 { public int id; public String name; } static class P31 extends Base3 { @Override public String toString() { return "P31 [id=" + id + ", name=" + name + "]"; } } static class P32 extends Base3 { @Override public String toString() { return "P32 [id=" + id + ", name=" + name + "]"; } } static class Animal3 { public List<Base3> list = new ArrayList<Base3>(); }
参考:
http://qiita.com/opengl-8080/items/b613b9b3bc5d796c840c
http://www.baeldung.com/jackson