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との連携
★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();