Jackson实例入门

Jackson:Java平台的JSON解析器。

[b]版本:[/b]
jackson-databind-2.8.8.1.jar
jackson-core-2.8.8.jar
jackson-annotations-2.8.8.jar

[b]1.基本[/b]

[color=blue]字符串和对象间的转换[/color]

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 +"]";
}
}


[color=blue]字符串和数组间的转换[/color]

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);
}


[color=blue]字符串和集合间的转换[/color]

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}]
}


[color=blue]其他[/color]

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]
}

[quote]{"id":111,"name":"rensanning111"}[/quote]


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 +"]";
}
}


[b]2.设置[/b]

[color=blue]SerializationFeature[/color]

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"
// }
}


[color=blue]DeserializationFeature[/color]

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]
}


[b]3.类型[/b]

[color=blue]TypeReference[/color]

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]]
}


[b]4.注解[/b]

[color=blue]@JsonProperty[/color]

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 +"]";
}
}


[color=blue]@JsonIgnore[/color]

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 +"]";
}
}


[color=blue]@JsonIgnoreProperties[/color]

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 +"]";
}
}


[color=blue]@JsonCreator[/color]

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 +"]";
}
}


[color=blue]@JsonAnyGetter[/color]

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;
}
}


[color=blue]@JsonAnySetter[/color]

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);
}
}


[color=blue]@JsonSerialize[/color]

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));
}
}


[color=blue]@JsonDeserialize[/color]

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);
}
}
}


[color=blue]@JsonView[/color]

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;
}


[b]5.类信息[/b]

[color=blue]JsonTypeInfo.Id.CLASS[/color]

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 +"]";
}
}


[color=blue]JsonTypeInfo.Id.CUSTOM[/color]

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);
}
}


[color=blue]JsonTypeInfo.As.WRAPPER_OBJECT[/color]

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 +"]";
}
}


[color=blue]JsonTypeInfo.As.EXTERNAL_PROPERTY[/color]

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;
}


[b]6.抽象类[/b]

[color=blue]@JsonTypeInfo(use=Id.CLASS)[/color]

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>();
}


[color=blue]mapper.enableDefaultTyping();[/color]

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>();
}


[color=blue]@JsonSubTypes[/color]

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值