- Jackson 註解教程
- Jackson - 首頁
- 序列化註解
- Jackson - @JsonAnyGetter
- Jackson - @JsonGetter
- @JsonPropertyOrder
- Jackson - @JsonRawValue
- Jackson - @JsonValue
- Jackson - @JsonRootName
- Jackson - @JsonSerialize
- 反序列化註解
- Jackson - @JsonCreator
- Jackson - @JacksonInject
- Jackson - @JsonAnySetter
- Jackson - @JsonSetter
- Jackson - @JsonDeserialize
- @JsonEnumDefaultValue
- 屬性包含註解
- @JsonIgnoreProperties
- Jackson - @JsonIgnore
- Jackson - @JsonIgnoreType
- Jackson - @JsonInclude
- Jackson - @JsonAutoDetect
- 型別處理註解
- Jackson - @JsonTypeInfo
- Jackson - @JsonSubTypes
- Jackson - @JsonTypeName
- 通用註解
- Jackson - @JsonProperty
- Jackson - @JsonFormat
- Jackson - @JsonUnwrapped
- Jackson - @JsonView
- @JsonManagedReference
- @JsonBackReference
- Jackson - @JsonIdentityInfo
- Jackson - @JsonFilter
- 其他
- 自定義註解
- Mixin 註解
- 停用註解
- Jackson 註解資源
- Jackson - 快速指南
- Jackson - 有用資源
- Jackson - 討論
Jackson 註解 - 快速指南
Jackson 註解 - @JsonAnyGetter
@JsonAnyGetter 允許一個 getter 方法返回 Map,然後以與其他屬性類似的方式用於序列化 JSON 的附加屬性。
沒有 @JsonAnyGetter 的示例
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonTester {
public static void main(String args[]){
ObjectMapper mapper = new ObjectMapper();
try{
Student student = new Student();
student.add("Name", "Mark");
student.add("RollNo", "1");
String jsonString = mapper
.writerWithDefaultPrettyPrinter()
.writeValueAsString(student);
System.out.println(jsonString);
}
catch (IOException e) {
e.printStackTrace();
}
}
}
class Student {
private Map<String, String> properties;
public Student(){
properties = new HashMap<>();
}
public Map<String, String> getProperties(){
return properties;
}
public void add(String property, String value){
properties.put(property, value);
}
}
輸出
{
"properties" : {
"RollNo" : "1",
"Name" : "Mark"
}
}
帶有 @JsonAnyGetter 的示例
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonTester {
public static void main(String args[]){
ObjectMapper mapper = new ObjectMapper();
try{
Student student = new Student();
student.add("Name", "Mark");
student.add("RollNo", "1");
String jsonString = mapper
.writerWithDefaultPrettyPrinter()
.writeValueAsString(student);
System.out.println(jsonString);
}
catch (IOException e) {
e.printStackTrace();
}
}
}
class Student {
private Map<String, String> properties;
public Student(){
properties = new HashMap<>();
}
@JsonAnyGetter
public Map<String, String> getProperties(){
return properties;
}
public void add(String property, String value){
properties.put(property, value);
}
}
輸出
{
"RollNo" : "1",
"Name" : "Mark"
}
Jackson 註解 - @JsonGetter
@JsonGetter 允許將特定方法標記為 getter 方法。
沒有 @JsonGetter 的示例
import java.io.IOException;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonTester {
public static void main(String args[]){
ObjectMapper mapper = new ObjectMapper();
try {
Student student = new Student("Mark", 1);
String jsonString = mapper
.writerWithDefaultPrettyPrinter()
.writeValueAsString(student);
System.out.println(jsonString);
}
catch (IOException e) {
e.printStackTrace();
}
}
}
class Student {
private String name;
private int rollNo;
public Student(String name, int rollNo){
this.name = name;
this.rollNo = rollNo;
}
public String getStudentName(){
return name;
}
public int getRollNo(){
return rollNo;
}
}
輸出
{
"studentName" : "Mark",
"rollNo" : 1
}
帶有 @JsonGetter 的示例
import java.io.IOException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.annotation.JsonGetter;
public class JacksonTester {
public static void main(String args[]){
ObjectMapper mapper = new ObjectMapper();
try {
Student student = new Student("Mark", 1);
String jsonString = mapper
.writerWithDefaultPrettyPrinter()
.writeValueAsString(student);
System.out.println(jsonString);
}
catch (IOException e) {
e.printStackTrace();
}
}
}
class Student {
private String name;
private int rollNo;
public Student(String name, int rollNo){
this.name = name;
this.rollNo = rollNo;
}
@JsonGetter
public String getStudentName(){
return name;
}
public int getRollNo(){
return rollNo;
}
}
輸出
{
"name" : "Mark",
"rollNo" : 1
}
Jackson 註解 - @JsonPropertyOrder
@JsonPropertyOrder 允許在序列化 JSON 物件時保持特定的順序。
沒有 @JsonPropertyOrder 的示例
import java.io.IOException;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonTester {
public static void main(String args[]){
ObjectMapper mapper = new ObjectMapper();
try {
Student student = new Student("Mark", 1);
String jsonString = mapper
.writerWithDefaultPrettyPrinter()
.writeValueAsString(student);
System.out.println(jsonString);
}
catch (IOException e) {
e.printStackTrace();
}
}
}
class Student {
private String name;
private int rollNo;
public Student(String name, int rollNo) {
this.name = name;
this.rollNo = rollNo;
}
public String getName(){
return name;
}
public int getRollNo(){
return rollNo;
}
}
輸出
{
"name" : "Mark",
"rollNo" : 1
}
帶有 @JsonPropertyOrder 的示例
import java.io.IOException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
public class JacksonTester {
public static void main(String args[]){
ObjectMapper mapper = new ObjectMapper();
try {
Student student = new Student("Mark", 1);
String jsonString = mapper
.writerWithDefaultPrettyPrinter()
.writeValueAsString(student);
System.out.println(jsonString);
}
catch (IOException e) {
e.printStackTrace();
}
}
}
@JsonPropertyOrder({ "rollNo", "name" })
class Student {
private String name;
private int rollNo;
public Student(String name, int rollNo){
this.name = name;
this.rollNo = rollNo;
}
public String getName(){
return name;
}
public int getRollNo(){
return rollNo;
}
}
輸出
{
"name" : "Mark",
"rollNo" : 1
}
Jackson 註解 - @JsonRawValue
@JsonRawValue 允許序列化文字而不進行轉義或任何修飾。
沒有 @JsonRawValue 的示例
import java.io.IOException;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonTester {
public static void main(String args[]){
ObjectMapper mapper = new ObjectMapper();
try {
Student student = new Student("Mark", 1, "{\"attr\":false}");
String jsonString = mapper
.writerWithDefaultPrettyPrinter()
.writeValueAsString(student);
System.out.println(jsonString);
}
catch (IOException e) {
e.printStackTrace();
}
}
}
class Student {
private String name;
private int rollNo;
private String json;
public Student(String name, int rollNo, String json){
this.name = name;
this.rollNo = rollNo;
this.json = json;
}
public String getName(){
return name;
}
public int getRollNo(){
return rollNo;
}
public String getJson(){
return json;
}
}
輸出
{
"name" : "Mark",
"rollNo" : 1,
"json" : {\"attr\":false}
}
帶有 @JsonRawValue 的示例
import java.io.IOException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.annotation.JsonRawValue;
public class JacksonTester {
public static void main(String args[]){
ObjectMapper mapper = new ObjectMapper();
try {
Student student = new Student("Mark", 1, "{\"attr\":false}");
String jsonString = mapper
.writerWithDefaultPrettyPrinter()
.writeValueAsString(student);
System.out.println(jsonString);
}
catch (IOException e) {
e.printStackTrace();
}
}
}
class Student {
private String name;
private int rollNo;
@JsonRawValue
private String json;
public Student(String name, int rollNo, String json) {
this.name = name;
this.rollNo = rollNo;
this.json = json;
}
public String getName(){
return name;
}
public int getRollNo(){
return rollNo;
}
public String getJson(){
return json;
}
}
輸出
{
"name" : "Mark",
"rollNo" : 1,
"json" : {"attr":false}
}
Jackson 註解 - @JsonValue
@JsonValue 允許使用其單個方法序列化整個物件。
帶有 @JsonValue 的示例
import java.io.IOException;
import com.fasterxml.jackson.annotation.JsonValue;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonTester {
public static void main(String args[]){
ObjectMapper mapper = new ObjectMapper();
try {
Student student = new Student("Mark", 1);
String jsonString = mapper
.writerWithDefaultPrettyPrinter()
.writeValueAsString(student);
System.out.println(jsonString);
}
catch (IOException e) {
e.printStackTrace();
}
}
}
class Student {
private String name;
private int rollNo;
public Student(String name, int rollNo){
this.name = name;
this.rollNo = rollNo;
}
public String getName(){
return name;
}
public int getRollNo(){
return rollNo;
}
@JsonValue
public String toString(){
return "{ name : " + name + " }";
}
}
輸出
"{ name : Mark }"
Jackson 註解 - @JsonRootName
@JsonRootName 允許在 JSON 上指定根節點。我們也需要啟用包裝根值。
帶有 @JsonRootName 的示例
import java.io.IOException;
import com.fasterxml.jackson.annotation.JsonRootName;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
public class JacksonTester {
public static void main(String args[]){
ObjectMapper mapper = new ObjectMapper();
try {
Student student = new Student("Mark", 1);
mapper.enable(SerializationFeature.WRAP_ROOT_VALUE);
String jsonString = mapper
.writerWithDefaultPrettyPrinter()
.writeValueAsString(student);
System.out.println(jsonString);
}
catch (IOException e) {
e.printStackTrace();
}
}
}
@JsonRootName(value = "student")
class Student {
private String name;
private int rollNo;
public Student(String name, int rollNo){
this.name = name;
this.rollNo = rollNo;
}
public String getName(){
return name;
}
public int getRollNo(){
return rollNo;
}
}
輸出
{
"student" : {
"name" : "Mark",
"rollNo" : 1
}
}
Jackson 註解 - @JsonSerialize
@JsonSerialize 用於指定自定義序列化器來編組 json 物件。
帶有 @JsonSerialize 的示例
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
public class JacksonTester {
public static void main(String args[]) throws ParseException {
ObjectMapper mapper = new ObjectMapper();
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
try {
Student student = new Student("Mark", 1, dateFormat.parse("20-11-1984"));
String jsonString = mapper
.writerWithDefaultPrettyPrinter()
.writeValueAsString(student);
System.out.println(jsonString);
}
catch (IOException e) {
e.printStackTrace();
}
}
}
class Student {
private String name;
private int rollNo;
@JsonSerialize(using = CustomDateSerializer.class)
private Date dateOfBirth;
public Student(String name, int rollNo, Date dob){
this.name = name;
this.rollNo = rollNo;
this.dateOfBirth = dob;
}
public String getName(){
return name;
}
public int getRollNo(){
return rollNo;
}
public Date getDateOfBirth(){
return dateOfBirth;
}
}
class CustomDateSerializer extends StdSerializer<Date> {
private static final long serialVersionUID = 1L;
private static SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");
public CustomDateSerializer() {
this(null);
}
public CustomDateSerializer(Class<Date> t) {
super(t);
}
@Override
public void serialize(Date value,
JsonGenerator generator, SerializerProvider arg2) throws IOException {
generator.writeString(formatter.format(value));
}
}
輸出
{
"name" : "Mark",
"rollNo" : 1,
"dateOfBirth" : "20-11-1984"
}
Jackson 註解 - @JsonCreator
@JsonCreator 用於微調反序列化中使用的建構函式或工廠方法。我們也將使用 @JsonProperty 來實現相同的功能。在下面的示例中,我們透過定義所需的屬性名稱,將不同格式的 json 與我們的類進行匹配。
帶有 @JsonCreator 的示例
import java.io.IOException;
import java.text.ParseException;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonTester {
public static void main(String args[]) throws ParseException{
String json = "{\"id\":1,\"theName\":\"Mark\"}";
ObjectMapper mapper = new ObjectMapper();
try {
Student student = mapper
.readerFor(Student.class)
.readValue(json);
System.out.println(student.rollNo +", " + student.name);
}
catch (IOException e) {
e.printStackTrace();
}
}
}
class Student {
public String name;
public int rollNo;
@JsonCreator
public Student(@JsonProperty("theName") String name, @JsonProperty("id") int rollNo){
this.name = name;
this.rollNo = rollNo;
}
}
輸出
1, Mark
Jackson 註解 - @JacksonInject
@JacksonInject 用於在需要注入屬性值而不是從 Json 輸入中解析屬性值時使用。在下面的示例中,我們向物件中插入一個值,而不是從 Json 中解析。
帶有 @JacksonInject 的示例
import java.io.IOException;
import java.text.ParseException;
import com.fasterxml.jackson.annotation.JacksonInject;
import com.fasterxml.jackson.databind.InjectableValues;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonTester {
public static void main(String args[]) throws ParseException{
String json = "{\"name\":\"Mark\"}";
InjectableValues injectableValues = new InjectableValues.Std()
.addValue(int.class, 1);
ObjectMapper mapper = new ObjectMapper();
try {
Student student = mapper
.reader(injectableValues)
.forType(Student.class)
.readValue(json);
System.out.println(student.rollNo +", " + student.name);
}
catch (IOException e) {
e.printStackTrace();
}
}
}
class Student {
public String name;
@JacksonInject
public int rollNo;
}
輸出
1, Mark
Jackson 註解 - @JsonAnySetter
@JsonAnySetter 允許一個 setter 方法使用 Map,然後以與其他屬性類似的方式用於反序列化 JSON 的附加屬性。
帶有 @JsonAnySetter 的示例
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonTester {
public static void main(String args[]){
ObjectMapper mapper = new ObjectMapper();
String jsonString = "{\"RollNo\" : \"1\",\"Name\" : \"Mark\"}";
try {
Student student = mapper.readerFor(Student.class).readValue(jsonString);
System.out.println(student.getProperties().get("Name"));
System.out.println(student.getProperties().get("RollNo"));
}
catch (IOException e) {
e.printStackTrace();
}
}
}
class Student {
private Map<String, String> properties;
public Student(){
properties = new HashMap<>();
}
public Map<String, String> getProperties(){
return properties;
}
@JsonAnySetter
public void add(String property, String value){
properties.put(property, value);
}
}
輸出
Mark 1
Jackson 註解 - @JsonSetter
@JsonSetter 允許將特定方法標記為 setter 方法。
帶有 @JsonSetter 的示例
import java.io.IOException;
import com.fasterxml.jackson.annotation.JsonSetter;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonTester {
public static void main(String args[]){
ObjectMapper mapper = new ObjectMapper();
String jsonString = "{\"rollNo\":1,\"name\":\"Marks\"}";
try {
Student student = mapper.readerFor(Student.class).readValue(jsonString);
System.out.println(student.name);
}
catch (IOException e) {
e.printStackTrace();
}
}
}
class Student {
public int rollNo;
public String name;
@JsonSetter("name")
public void setTheName(String name) {
this.name = name;
}
}
輸出
Marks
Jackson 註解 - @JsonDeserialize
@JsonDeserialize 用於指定自定義反序列化器來反編組 json 物件。
帶有 @JsonDeserialize 的示例
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
public class JacksonTester {
public static void main(String args[]) throws ParseException{
ObjectMapper mapper = new ObjectMapper();
String jsonString = "{\"name\":\"Mark\",\"dateOfBirth\":\"20-12-1984\"}";
try {
Student student = mapper
.readerFor(Student.class)
.readValue(jsonString);
System.out.println(student.dateOfBirth);
}
catch (IOException e) {
e.printStackTrace();
}
}
}
class Student {
public String name;
@JsonDeserialize(using = CustomDateDeserializer.class)
public Date dateOfBirth;
}
class CustomDateDeserializer extends StdDeserializer<Date> {
private static final long serialVersionUID = 1L;
private static SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");
public CustomDateDeserializer() {
this(null);
}
public CustomDateDeserializer(Class<Date> t) {
super(t);
}
@Override
public Date deserialize(JsonParser parser, DeserializationContext context)
throws IOException, JsonProcessingException {
String date = parser.getText();
try {
return formatter.parse(date);
}
catch (ParseException e) {
e.printStackTrace();
}
return null;
}
}
輸出
Thu Dec 20 00:00:00 IST 1984
Jackson 註解 - @JsonEnumDefaultValue
@JsonEnumDefaultValue 用於使用預設值反序列化未知的列舉值。
帶有 @JsonEnumDefaultValue 的示例
import java.io.IOException;
import java.text.ParseException;
import com.fasterxml.jackson.annotation.JsonEnumDefaultValue;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonTester {
public static void main(String args[]) throws ParseException{
ObjectMapper mapper = new ObjectMapper();
mapper.enable(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE);
String jsonString = "\"abc\"";
try {
LETTERS value = mapper.readValue(jsonString, LETTERS.class);
System.out.println(value);
}
catch (IOException e) {
e.printStackTrace();
}
}
}
enum LETTERS {
A, B, @JsonEnumDefaultValue UNKNOWN
}
輸出
UNKNOWN
Jackson 註解 - @JsonIgnoreProperties
@JsonIgnoreProperties 用於類級別,用於標記要忽略的屬性或屬性列表。
帶有 @JsonIgnoreProperties 的示例
import java.io.IOException;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonTester {
public static void main(String args[]) {
ObjectMapper mapper = new ObjectMapper();
try {
Student student = new Student(1,11,"1ab","Mark");
String jsonString = mapper
.writerWithDefaultPrettyPrinter()
.writeValueAsString(student);
System.out.println(jsonString);
}
catch (IOException e) {
e.printStackTrace();
}
}
}
@JsonIgnoreProperties({ "id", "systemId" })
class Student {
public int id;
public String systemId;
public int rollNo;
public String name;
Student(int id, int rollNo, String systemId, String name){
this.id = id;
this.systemId = systemId;
this.rollNo = rollNo;
this.name = name;
}
}
輸出
{
"rollNo" : 11,
"name" : "Mark"
}
Jackson 註解 - @JsonIgnore
@JsonIgnore 用於欄位級別,用於標記要忽略的屬性或屬性列表。
帶有 @JsonIgnore 的示例
import java.io.IOException;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonTester {
public static void main(String args[]){
ObjectMapper mapper = new ObjectMapper();
try{
Student student = new Student(1,11,"1ab","Mark");
String jsonString = mapper
.writerWithDefaultPrettyPrinter()
.writeValueAsString(student);
System.out.println(jsonString);
}
catch (IOException e) {
e.printStackTrace();
}
}
}
class Student {
public int id;
@JsonIgnore
public String systemId;
public int rollNo;
public String name;
Student(int id, int rollNo, String systemId, String name){
this.id = id;
this.systemId = systemId;
this.rollNo = rollNo;
this.name = name;
}
}
輸出
{
"id" : 1,
"rollNo" : 11,
"name" : "Mark"
}
Jackson 註解 - @JsonIgnoreType
@JsonIgnoreType 用於標記要忽略的特殊型別屬性。
帶有 @JsonIgnoreType 的示例
import java.io.IOException;
import com.fasterxml.jackson.annotation.JsonIgnoreType;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonTester {
public static void main(String args[]){
ObjectMapper mapper = new ObjectMapper();
try {
Student student = new Student(1,11,"1ab","Mark");
String jsonString = mapper
.writerWithDefaultPrettyPrinter()
.writeValueAsString(student);
System.out.println(jsonString);
}
catch (IOException e) {
e.printStackTrace();
}
}
}
class Student {
public int id;
@JsonIgnore
public String systemId;
public int rollNo;
public Name nameObj;
Student(int id, int rollNo, String systemId, String name){
this.id = id;
this.systemId = systemId;
this.rollNo = rollNo;
nameObj = new Name(name);
}
@JsonIgnoreType
class Name {
public String name;
Name(String name){
this.name = name;
}
}
}
輸出
{
"id" : 1,
"systemId" : "1ab",
"rollNo" : 11
}
Jackson 註解 - @JsonInclude
@JsonInclude 用於排除具有空/空或預設值的屬性。
帶有 @JsonInclude 的示例
import java.io.IOException;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonTester {
public static void main(String args[]){
ObjectMapper mapper = new ObjectMapper();
try {
Student student = new Student(1,null);
String jsonString = mapper
.writerWithDefaultPrettyPrinter()
.writeValueAsString(student);
System.out.println(jsonString);
}
catch (IOException e) {
e.printStackTrace();
}
}
}
@JsonInclude(JsonInclude.Include.NON_NULL)
class Student {
public int id;
public String name;
Student(int id,String name){
this.id = id;
this.name = name;
}
}
輸出
{
"id" : 1
}
Jackson 註解 - @JsonAutoDetect
@JsonAutoDetect 可用於包含否則無法訪問的屬性。
帶有 @JsonAutoDetect 的示例
import java.io.IOException;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonTester {
public static void main(String args[]){
ObjectMapper mapper = new ObjectMapper();
try{
Student student = new Student(1,"Mark");
String jsonString = mapper
.writerWithDefaultPrettyPrinter()
.writeValueAsString(student);
System.out.println(jsonString);
}
catch (IOException e) {
e.printStackTrace();
}
}
}
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
class Student {
private int id;
private String name;
Student(int id,String name) {
this.id = id;
this.name = name;
}
}
輸出
{
"id" : 1,
"name" : "Mark"
}
Jackson 註解 - @JsonTypeInfo
@JsonTypeInfo 用於指示要包含在序列化和反序列化中的型別資訊的詳細資訊。
帶有 @JsonTypeInfo 的示例
import java.io.IOException;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.JsonTypeInfo.As;
import com.fasterxml.jackson.annotation.JsonTypeName;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonTester {
public static void main(String args[]) throws IOException {
Shape shape = new JacksonTester.Circle("CustomCircle", 1);
String result = new ObjectMapper()
.writerWithDefaultPrettyPrinter()
.writeValueAsString(shape);
System.out.println(result);
String json = "{\"name\":\"CustomCircle\",\"radius\":1.0, \"type\":\"circle\"}";
Circle circle = new ObjectMapper().readerFor(Shape.class).readValue(json);
System.out.println(circle.name);
}
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME,
include = As.PROPERTY, property = "type") @JsonSubTypes({
@JsonSubTypes.Type(value = Square.class, name = "square"),
@JsonSubTypes.Type(value = Circle.class, name = "circle")
})
static class Shape {
public String name;
Shape(String name){
this.name = name;
}
}
@JsonTypeName("square")
static class Square extends Shape {
public double length;
Square(){
this(null,0.0);
}
Square(String name, double length){
super(name);
this.length = length;
}
}
@JsonTypeName("circle")
static class Circle extends Shape {
public double radius;
Circle(){
this(null,0.0);
}
Circle(String name, double radius) {
super(name);
this.radius = radius;
}
}
}
輸出
{
"type" : "circle",
"name" : "CustomCircle",
"radius" : 1.0
}
CustomCircle
Jackson 註解 - @JsonSubTypes
@JsonSubTypes 用於指示已註釋型別的子型別。
帶有 @JsonSubTypes 的示例
import java.io.IOException;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.JsonTypeInfo.As;
import com.fasterxml.jackson.annotation.JsonTypeName;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonTester {
public static void main(String args[]) throws IOException{
Shape shape = new JacksonTester.Circle("CustomCircle", 1);
String result = new ObjectMapper()
.writerWithDefaultPrettyPrinter()
.writeValueAsString(shape);
System.out.println(result);
String json = "{\"name\":\"CustomCircle\",\"radius\":1.0, \"type\":\"circle\"}";
Circle circle = new ObjectMapper().readerFor(Shape.class).readValue(json);
System.out.println(circle.name);
}
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME,
include = As.PROPERTY, property = "type") @JsonSubTypes({
@JsonSubTypes.Type(value = Square.class, name = "square"),
@JsonSubTypes.Type(value = Circle.class, name = "circle")
})
static class Shape {
public String name;
Shape(String name) {
this.name = name;
}
}
@JsonTypeName("square")
static class Square extends Shape {
public double length;
Square(){
this(null,0.0);
}
Square(String name, double length){
super(name);
this.length = length;
}
}
@JsonTypeName("circle")
static class Circle extends Shape {
public double radius;
Circle(){
this(null,0.0);
}
Circle(String name, double radius){
super(name);
this.radius = radius;
}
}
}
輸出
{
"type" : "circle",
"name" : "CustomCircle",
"radius" : 1.0
}
CustomCircle
Jackson 註解 - @JsonTypeName
@JsonTypeName 用於設定要用於已註釋類的型別名稱。
帶有 @JsonTypeName 的示例
import java.io.IOException;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.JsonTypeInfo.As;
import com.fasterxml.jackson.annotation.JsonTypeName;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonTester {
public static void main(String args[]) throws IOException {
Shape shape = new JacksonTester.Circle("CustomCircle", 1);
String result = new ObjectMapper()
.writerWithDefaultPrettyPrinter()
.writeValueAsString(shape);
System.out.println(result);
String json = "{\"name\":\"CustomCircle\",\"radius\":1.0, \"type\":\"circle\"}";
Circle circle = new ObjectMapper().readerFor(Shape.class).readValue(json);
System.out.println(circle.name);
}
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME,
include = As.PROPERTY, property = "type") @JsonSubTypes({
@JsonSubTypes.Type(value = Square.class, name = "square"),
@JsonSubTypes.Type(value = Circle.class, name = "circle")
})
static class Shape {
public String name;
Shape(String name){
this.name = name;
}
}
@JsonTypeName("square")
static class Square extends Shape {
public double length;
Square(){
this(null,0.0);
}
Square(String name, double length){
super(name);
this.length = length;
}
}
@JsonTypeName("circle")
static class Circle extends Shape {
public double radius;
Circle(){
this(null,0.0);
}
Circle(String name, double radius){
super(name);
this.radius = radius;
}
}
}
輸出
{
"type" : "circle",
"name" : "CustomCircle",
"radius" : 1.0
}
CustomCircle
Jackson 註解 - @JsonProperty
@JsonProperty 用於標記非標準 getter/setter 方法,以便與 json 屬性一起使用。
帶有 @JsonProperty 的示例
import java.io.IOException;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonTester {
public static void main(String args[]) throws IOException {
ObjectMapper mapper = new ObjectMapper();
String json = "{\"id\" : 1}";
Student student = mapper.readerFor(Student.class).readValue(json);
System.out.println(student.getTheId());
}
}
class Student {
private int id;
Student(){}
Student(int id){
this.id = id;
}
@JsonProperty("id")
public int getTheId() {
return id;
}
@JsonProperty("id")
public void setTheId(int id) {
this.id = id;
}
}
輸出
1
Jackson 註解 - @JsonFormat
@JsonFormat 用於在序列化或反序列化時指定格式。它主要用於 Date 欄位。
帶有 @JsonFormat 的示例
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonTester {
public static void main(String args[]) throws IOException, ParseException {
ObjectMapper mapper = new ObjectMapper();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd-MM-yyyy");
Date date = simpleDateFormat.parse("20-12-1984");
Student student = new Student(1, date);
String jsonString = mapper
.writerWithDefaultPrettyPrinter()
.writeValueAsString(student);
System.out.println(jsonString);
}
}
class Student {
public int id;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy")
public Date birthDate;
Student(int id, Date birthDate){
this.id = id;
this.birthDate = birthDate;
}
}
輸出
{
"id" : 1,
"birthDate" : "19-12-1984"
}
Jackson 註解 - @JsonUnwrapped
@JsonUnwrapped 用於在序列化或反序列化期間解包物件的值。
帶有 @JsonUnwrapped 的示例
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonUnwrapped;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonTester {
public static void main(String args[]) throws IOException, ParseException{
ObjectMapper mapper = new ObjectMapper();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd-MM-yyyy");
Date date = simpleDateFormat.parse("20-12-1984");
Student.Name name = new Student.Name();
name.first = "Jane";
name.last = "Doe";
Student student = new Student(1, name);
String jsonString = mapper
.writerWithDefaultPrettyPrinter()
.writeValueAsString(student);
System.out.println(jsonString);
}
}
class Student {
public int id;
@JsonUnwrapped
public Name name;
Student(int id, Name name){
this.id = id;
this.name = name;
}
static class Name {
public String first;
public String last;
}
}
輸出
{
"id" : 1,
"first" : "Jane",
"last" : "Doe"
}
Jackson 註解 - @JsonView
@JsonView 用於控制要序列化或不序列化的值。
帶有 @JsonView 的示例
import java.io.IOException;
import java.text.ParseException;
import com.fasterxml.jackson.annotation.JsonView;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonTester {
public static void main(String args[]) throws IOException, ParseException {
ObjectMapper mapper = new ObjectMapper();
Student student = new Student(1, "Mark", 12);
String jsonString = mapper
.writerWithDefaultPrettyPrinter()
.withView(Views.Public.class)
.writeValueAsString(student);
System.out.println(jsonString);
}
}
class Student {
@JsonView(Views.Public.class)
public int id;
@JsonView(Views.Public.class)
public String name;
@JsonView(Views.Internal.class)
public int age;
Student(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
}
class Views {
static class Public {}
static class Internal extends Public {}
}
輸出
{
"id" : 1,
"name" : "Mark"
}
Jackson 註解 - @JsonManagedReference
@JsonManagedReferences 和 JsonBackReferences 用於顯示具有父子關係的物件。@JsonManagedReferences 用於引用父物件,@JsonBackReferences 用於標記子物件。
帶有 @JsonManagedReferences 的示例
import java.io.IOException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonBackReference;
import com.fasterxml.jackson.annotation.JsonManagedReference;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonTester {
public static void main(String args[]) throws IOException, ParseException {
ObjectMapper mapper = new ObjectMapper();
Student student = new Student(1, "Mark");
Book book1 = new Book(1,"Learn HTML", student);
Book book2 = new Book(1,"Learn JAVA", student);
student.addBook(book1);
student.addBook(book2);
String jsonString = mapper
.writerWithDefaultPrettyPrinter()
.writeValueAsString(book1);
System.out.println(jsonString);
}
}
class Student {
public int rollNo;
public String name;
@JsonBackReference
public List<Book> books;
Student(int rollNo, String name){
this.rollNo = rollNo;
this.name = name;
this.books = new ArrayList<Book>();
}
public void addBook(Book book){
books.add(book);
}
}
class Book {
public int id;
public String name;
Book(int id, String name, Student owner){
this.id = id;
this.name = name;
this.owner = owner;
}
@JsonManagedReference
public Student owner;
}
輸出
{
"id" : 1,
"name" : "Learn HTML",
"owner" : {
"rollNo" : 1,
"name" : "Mark"
}
}
Jackson 註解 - @JsonBackReference
@JsonManagedReferences 和 JsonBackReferences 用於顯示具有父子關係的物件。@JsonManagedReferences 用於引用父物件,@JsonBackReferences 用於標記子物件。
帶有 @JsonBackReferences 的示例
import java.io.IOException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonBackReference;
import com.fasterxml.jackson.annotation.JsonManagedReference;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonTester {
public static void main(String args[]) throws IOException, ParseException {
ObjectMapper mapper = new ObjectMapper();
Student student = new Student(1, "Mark");
Book book1 = new Book(1,"Learn HTML", student);
Book book2 = new Book(1,"Learn JAVA", student);
student.addBook(book1);
student.addBook(book2);
String jsonString = mapper
.writerWithDefaultPrettyPrinter()
.writeValueAsString(book1);
System.out.println(jsonString);
}
}
class Student {
public int rollNo;
public String name;
@JsonBackReference
public List<Book> books;
Student(int rollNo, String name){
this.rollNo = rollNo;
this.name = name;
this.books = new ArrayList<Book>();
}
public void addBook(Book book){
books.add(book);
}
}
class Book {
public int id;
public String name;
Book(int id, String name, Student owner) {
this.id = id;
this.name = name;
this.owner = owner;
}
@JsonManagedReference
public Student owner;
}
輸出
{
"id" : 1,
"name" : "Learn HTML",
"owner" : {
"rollNo" : 1,
"name" : "Mark"
}
}
Jackson 註解 - @JsonIdentityInfo
@JsonIdentityInfo 用於物件具有父子關係時。@JsonIdentityInfo 用於指示在序列化/反序列化期間將使用物件標識。
帶有 @JsonIdentityInfo 的示例
import java.io.IOException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.ObjectIdGenerators;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonTester {
public static void main(String args[]) throws IOException, ParseException{
ObjectMapper mapper = new ObjectMapper();
Student student = new Student(1,13, "Mark");
Book book1 = new Book(1,"Learn HTML", student);
Book book2 = new Book(2,"Learn JAVA", student);
student.addBook(book1);
student.addBook(book2);
String jsonString = mapper
.writerWithDefaultPrettyPrinter()
.writeValueAsString(book1);
System.out.println(jsonString);
}
}
@JsonIdentityInfo(
generator = ObjectIdGenerators.PropertyGenerator.class,
property = "id")
class Student {
public int id;
public int rollNo;
public String name;
public List<Book> books;
Student(int id, int rollNo, String name){
this.id = id;
this.rollNo = rollNo;
this.name = name;
this.books = new ArrayList<Book>();
}
public void addBook(Book book){
books.add(book);
}
}
@JsonIdentityInfo(
generator = ObjectIdGenerators.PropertyGenerator.class,
property = "id")
class Book{
public int id;
public String name;
Book(int id, String name, Student owner){
this.id = id;
this.name = name;
this.owner = owner;
}
public Student owner;
}
輸出
{
"id" : 1,
"name" : "Learn HTML",
"owner" : {
"id" : 1,
"rollNo" : 13,
"name" : "Mark",
"books" : [
1, {
"id" : 2,
"name" : "Learn JAVA",
"owner" : 1
}
]
}
}
Jackson 註解 - @JsonFilter
@JsonFilter 用於在序列化/反序列化期間應用過濾器,例如要使用或不使用的屬性。
帶有 @JsonFilter 的示例
import java.io.IOException;
import java.text.ParseException;
import com.fasterxml.jackson.annotation.JsonFilter;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ser.FilterProvider;
import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter;
import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider;
public class JacksonTester {
public static void main(String args[]) throws IOException, ParseException {
ObjectMapper mapper = new ObjectMapper();
Student student = new Student(1,13, "Mark");
FilterProvider filters = new SimpleFilterProvider() .addFilter(
"nameFilter", SimpleBeanPropertyFilter.filterOutAllExcept("name"));
String jsonString = mapper.writer(filters)
.withDefaultPrettyPrinter()
.writeValueAsString(student);
System.out.println(jsonString);
}
}
@JsonFilter("nameFilter")
class Student {
public int id;
public int rollNo;
public String name;
Student(int id, int rollNo, String name) {
this.id = id;
this.rollNo = rollNo;
this.name = name;
}
}
輸出
{
"name" : "Mark"
}
Jackson 註解 - 自定義註解
我們可以使用 @JacksonAnnotationsInside 註解輕鬆建立自定義註解。
帶有自定義註解的示例
import java.io.IOException;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.text.ParseException;
import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonTester {
public static void main(String args[]) throws IOException, ParseException {
ObjectMapper mapper = new ObjectMapper();
Student student = new Student(1,13, "Mark");
String jsonString = mapper
.writerWithDefaultPrettyPrinter()
.writeValueAsString(student);
System.out.println(jsonString);
}
}
@CustomAnnotation
class Student {
public int id;
public int rollNo;
public String name;
public String otherDetails;
Student(int id, int rollNo, String name){
this.id = id;
this.rollNo = rollNo;
this.name = name;
}
}
@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotationsInside
@JsonInclude(value = Include.NON_NULL)
@JsonPropertyOrder({ "rollNo", "id", "name" })
@interface CustomAnnotation {}
輸出
{
"rollNo" : 13,
"id" : 1,
"name" : "Mark"
}
Jackson 註解 - Mixin
Mixin 註解是一種在不修改目標類的情況下關聯註解的方法。請參見下面的示例 -
帶有 Mixin 註解的示例
import java.io.IOException;
import com.fasterxml.jackson.annotation.JsonIgnoreType;
import com.fasterxml.jackson.databind.MapperFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonTester {
public static void main(String args[]) {
ObjectMapper mapper = new ObjectMapper();
try {
Student student = new Student(1,11,"1ab","Mark");
String jsonString = mapper
.writerWithDefaultPrettyPrinter()
.writeValueAsString(student);
System.out.println(jsonString);
ObjectMapper mapper1 = new ObjectMapper();
mapper1.addMixIn(Name.class, MixInForIgnoreType.class);
jsonString = mapper1
.writerWithDefaultPrettyPrinter()
.writeValueAsString(student);
System.out.println(jsonString);
}
catch (IOException e) {
e.printStackTrace();
}
}
}
class Student {
public int id;
public String systemId;
public int rollNo;
public Name nameObj;
Student(int id, int rollNo, String systemId, String name) {
this.id = id;
this.systemId = systemId;
this.rollNo = rollNo;
nameObj = new Name(name);
}
}
class Name {
public String name;
Name(String name){
this.name = name;
}
}
@JsonIgnoreType
class MixInForIgnoreType {}
輸出
{
"id" : 1,
"systemId" : "1ab",
"rollNo" : 11,
"nameObj" : {
"name" : "Mark"
}
}
{
"id" : 1,
"systemId" : "1ab",
"rollNo" : 11
}
Jackson 註解 - 停用
我們可以使用 ObjectMapper 的 disable() 函式停用 jackson 註解。
停用註解的示例
import java.io.IOException;
import com.fasterxml.jackson.annotation.JsonIgnoreType;
import com.fasterxml.jackson.databind.MapperFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonTester {
public static void main(String args[]){
ObjectMapper mapper = new ObjectMapper();
try{
Student student = new Student(1,11,"1ab","Mark");
String jsonString = mapper
.writerWithDefaultPrettyPrinter()
.writeValueAsString(student);
System.out.println(jsonString);
ObjectMapper mapper1 = new ObjectMapper();
mapper1.disable(MapperFeature.USE_ANNOTATIONS);
jsonString = mapper1
.writerWithDefaultPrettyPrinter()
.writeValueAsString(student);
System.out.println(jsonString);
}
catch (IOException e) {
e.printStackTrace();
}
}
}
class Student {
public int id;
public String systemId;
public int rollNo;
public Name nameObj;
Student(int id, int rollNo, String systemId, String name){
this.id = id;
this.systemId = systemId;
this.rollNo = rollNo;
nameObj = new Name(name);
}
}
@JsonIgnoreType
class Name {
public String name;
Name(String name){
this.name = name;
}
}
輸出
{
"id" : 1,
"systemId" : "1ab",
"rollNo" : 11
}
{
"id" : 1,
"systemId" : "1ab",
"rollNo" : 11,
"nameObj" : {
"name" : "Mark"
}
}