Jackson

・Data Binding Model Convenient Inspired by the JAXB

・Tree Model Flexible Similar to the XML DOM

・Streaming Model Performing Inspired by the StAX API

★Hibernateとの連携

DEMO

★Ignore unknow JSON properties

・方法1

クラスに@JsonIgnoreProperties(ignoreUnknown=true)をつける

・方法2

objectMapper.configure(

DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);

・方法3

@JsonAnySetter

public void handleUnknown(String key, Object value) {

unknownParameters.put(key, value);

}

・方法4

objectMapper.getDeserializationConfig().addHandler(new JacksonProblemHandler());

final static class JacksonProblemHandler extends DeserializationProblemHandler {

public boolean handleUnknownProperty(

DeserializationContext ctxt,

JsonDeserializer<?> deserializer,

Object bean,

String propertyName) throws IOException, JsonProcessingException {

JsonParser jp = ctxt.getParser();

log.debug("Unknown property: " + propertyName + ":"

+ jp.getCurrentToken().toString() + " in class: "

+ bean.getClass().getSimpleName() );

jp.skipChildren();

return true;

}

}

★Data binding (Annotation)

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

import com.fasterxml.jackson.annotation.JsonProperty;

@JsonIgnoreProperties(ignoreUnknown = true)

@Setter @Getter

public class Name {

@JsonProperty

private String firstName;

@JsonProperty

private String lastName;

}

import com.fasterxml.jackson.annotation.JsonAutoDetect;

import com.fasterxml.jackson.annotation.JsonPropertyOrder;

@JsonAutoDetect(getterVisibility = JsonAutoDetect.Visibility.NONE)

@JsonPropertyOrder({ "id", "email", "name" })

@JsonIgnoreProperties(ignoreUnknown = true)

@Setter @Getter

public class User {

@JsonProperty

private String id;

@JsonProperty

private String email;

@JsonProperty

private Name name;

public User() {

name = new Name();

}

}

@JsonIgnore

public String getXxx() {

...

}

// Pretty print

objectMapper.configure(SerializationConfig.Feature.INDENT_OUTPUT, true);

// Ignore null values

objectMapper.getSerializationConfig()

.setSerializationInclusion(JsonSerialize.Inclusion.NON_NULL);

★サンプル

{

"name" : { "first" : "Andy", "last" : "Liu" },

"gender" : "MALE",

"verified" : false,

"userImage" : "ISHggreOS"

}

import lombok.*;

@ToString

public class User {

public enum Gender { MALE, FEMALE };

@ToString

public static class Name {

@Getter @Setter

private String first;

@Getter @Setter

private String last;

}

@Getter @Setter

private Gender gender;

@Getter @Setter

private Name name;

@Getter @Setter

private boolean isVerified;

@Getter @Setter

private byte[] userImage;

}

Data Binding (POJO) model

import com.fasterxml.jackson.databind.ObjectMapper;

// READ

ObjectMapper mapper = new ObjectMapper();

User user = mapper.readValue(new File("user.json"), User.class);

// WRITE

mapper.writeValue(new File("user-out.json"), user);

Data Binding (Raw) model

import com.fasterxml.jackson.core.type.TypeReference;

// READ

ObjectMapper mapper = new ObjectMapper();

Map<String, Object> userData

= mapper.readValue(new File("user.json"), Map.class);

あるいは

Map<String, User> userData

= mapper.readValue(new File("user.json"),

new TypeReference<Map<String,User>>() { });

// WRITE

Map<String,Object> userData = new HashMap<String,Object>();

Map<String,String> name = new HashMap<String,String>();

name.put("first", "Andy");

name.put("last", "Liu");

userData.put("name", name);

userData.put("gender", "MALE");

userData.put("verified", Boolean.FALSE);

userData.put("userImage", "ISHggreOS");

mapper.writeValue(new File("user-out.json"), userData);

Tree model

import com.fasterxml.jackson.databind.JsonNode;

import com.fasterxml.jackson.databind.node.ObjectNode;

// READ

ObjectMapper mapper = new ObjectMapper();

JsonNode rootNode = mapper.readTree(new File("user.json"));

//JsonNode rootNode = mapper.readValue(source, JsonNode.class);

JsonNode nameNode = rootNode.path("name");

String lastName = nameNode.path("last").textValue();

// MODIFY

if ("xxx".equalsIgnoreCase(lastName)) {

((ObjectNode)nameNode).put("last", "yyy");

}

mapper.writeValue(new File("user-out.json"), rootNode);

Streaming model

import com.fasterxml.jackson.core.JsonEncoding;

import com.fasterxml.jackson.core.JsonFactory;

import com.fasterxml.jackson.core.JsonGenerator;

// WRITE

JsonFactory f = new JsonFactory();

JsonGenerator g

= f.createGenerator(new File("user.json"), JsonEncoding.UTF8);

g.writeStartObject();

g.writeObjectFieldStart("name");

g.writeStringField("first", "Liu");

g.writeStringField("last", "Andy");

g.writeEndObject();

g.writeStringField("gender", Gender.MALE.name());

g.writeBooleanField("verified", false);

g.writeBinaryField("userImage", new byte[]{1, 2});

g.writeEndObject();

g.close();