ジャクソンのシリアライゼーションとデシリアライゼーションアプリケーションの実践

シリアル化されたオブジェクトを準備します
。教師クラスと生徒クラスの2つのクラスが準備されます。1人の生徒には1人の教師しかいません。
コンストラクタとセッターメソッドおよびゲッターメソッドはここでは省略されています。

Teacher.java

パブリッククラスTeacher { プライベート文字列名; プライベート整数時代; } Student.java



パッケージorg.zwx;

public class Student { private String name; プライベート整数時代; プライベートセックスセックス; private String fatherName; プライベート日付bornTime; 私立教師教師; } Sex.java







public enum Sex { MALE( "男")、FEMALE( "女");

private String name;

Sex(String name) {
    this.name = name;
}

public String getName() {
    return name;
}

}
4ジャクソン依存関係の導入
この例はGradleに基づいており、jackson-databindバージョン2.11.2がMaven中央倉庫から選択されています。

コンパイルグループ: 'com.fasterxml.jackson.core'、名前: 'jackson-databind'、バージョン: '2.11.2'
5 シリアル化とフォーマット出力
5.1このプロセスで
は、最初にオブジェクトをシリアル化する必要がありますstudentオブジェクト
はオブジェクトマッパーを作成し、jacksonパッケージの下のObjectMapper
はシリアル化関数を呼び出します。この例では、writeValueAsStringはオブジェクトを文字列に変換します。これは、
5.2コードを表示するのに便利です
public void testSerializable()throws IOException { Student student1 = new Student( " Xiao Ming "、18、Sex.MALE、" Wang Fugui "、new Date()、new Teacher("李老师 "、40)); Student student2 = new Student("小花 "、16、Sex.FEMALE、"大金”、new Date()、new Teacher( "赵老师"、38)); リストの生徒= new ArrayList <>(); student.add (student1); student.add(student2);




ObjectMapper mapper = new ObjectMapper();
String s = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(students);
System.out.println(s);

}
5.3結果
[{ "name": "Xiao Ming"、"age":18、"sex": "MALE"、"fatherName":"王富贵" "bornTime":1599996926917、"teacher":{ "name" :「李さん」、「年齢」:40 } }、{ 「名前」:「小花」、「年齢」:16、「性別」:「女性」「父親名」:「たくさんのお金」、「bornTime」: 1599996926917、"teacher":{ "name": "Mr. Zhao"、"age":38 } }] 5.4分析メソッドwriterWithDefaultPrettyPrinterが例で呼び出され、json形式を美化しています






















それ以外の場合は、[{"name": "Xiaoming"、 "age":18、 "sex": "MALE"、 "fatherName": "Wang Fugui"、 "bornTime":1599997061097、 "teacher":{"name"を出力します: "Mr。Li"、 "age":40}}、{"name": "小花"、 "age":16、 "sex": "FEMALE"、 "fatherName": "たくさんのお金"、 "bornTime": 1599997061097、 "teacher":{"name": "赵老师"、 "age":38}}]
6シリアル化された名前のカスタマイズ
6.1シナリオ
シリアル化されたjsonをハンプ名から、fatherNameなどのアンダースコア名に変更する必要がある場合father_nameに変更

フィールドfatherNameでアノテーションJsonProperty構成のみを使用する必要があります

6.2サンプルコード
@JsonProperty(“ father_name”)
private String fatherName;
@JsonProperty(“ born_time”)
private Date bornTime;
6.3サンプル結果
[{ “ name”:“ 小明”、“ age”:18、“ sex”:“ MALE "、"教師 ":{ "名前 ":" Mr. Li "、" age ":40 }、" father_name ":" Wang Fugui " " born_time ":1599997157609 }、{ " name ":" 小花"、"年齢":16、" sex ":" FEMALE "、" teacher ":{ " name ":" Mr. Zhao "、" age ":38 }、" father_name ":"大金 "、" born_time ":1599997157610 }] 7カスタム出力フォーマット7.1 bornTimeフォーマット設定






















現在のbornTime形式はUNIXタイムスタンプであり、非常に読みにくい

それをyyyy-MM-dd HH:mm:ssに変更し
、タイムゾーンをドンバ地区に設定します

サンプルコード

@JsonProperty(“ born_time”)
@JsonFormat(pattern =“ yyyy-MM-dd HH:mm:ss”、timezone =“ GMT + 8”)
private Date bornTime;
结果

[{ "名前": "小明"、"年齢":18、"セックス": "男性"、"教師":{ "名前": "ミスターリー"、"年齢":40 }、"father_name": " "Wang Fugui "、"born_time": "2020-09-13 19:50:47" }、{ "name": " 小花" "age":16、"sex": "FEMALE"、"teacher":{ 「名前」:「趙さん」、「年齢」:38 }、「father_name」:「大金」、「born_time」:「2020-09-13 19:50:47」}] 7.2性別を中国語設定するだけSexのメソッドgetOrdinalを追加し、注釈JsonValueを追加します。





















サンプルコード

@JsonValue
public String getOrdinal(){ return name; } サンプル結果


[{ "名前": "小明"、"年齢":18、"性別": "男"、"教師":{ "名前": "ミスターリー"、"年齢":40 }、"father_name": " Wang Fugui "、" born_time ":" 2020-09-13 19:57:47 " }、{ " name ":" 小花 " " age ":16、" sex ":"女 "、" teacher ":{ 「名前」:「Ms。Zhao 」、「age」:38 }、「father_name」:「たくさんのお金」、「born_time」:「2020-09-13 19:57:47」}} 7.3 一部のシーンでは、シリアル番号としてセックスが設定されています私は、0と1などのシリアル番号を持つ男性と女性を設定するのが好きです。つまり、列挙のシリアル番号:0は男性、1は女性を意味します





















このとき、SetのgetOrdinalメソッドを変更する必要があります。

戻り値の型をintに変更して
、親クラスのgetOrdinalメソッド呼び出す
サンプルコード

@JsonValue
public int getOrdinal(){ return super.ordinal(); } サンプル結果


[{ "名前": "Xiaoming"、"age":18、"sex":0、"teacher":{ "name": "Mr. Li"、"age":40 }、"father_name": "Wang Fugui "、" born_time ":" 2020-09-13 20:01:44 " }、{ " name ":" 小花 " " age ":16、" sex ":1、" teacher ":{ " name ": 「Mr. Zhao」、「age」:38 }、「father_name」:「大金」、「born_time」:「2020-09-13 20:01:44」}] 8ネストされたタイプのペーシングシーンは上記のとおりです結果は、教師の2つの属性が生徒の最初の層にないことを示しています。時には、それらはより深くなる可能性があり、使いにくい























Teacherの代わりに2つの属性Teacher_nameとTeacher_ageを使用するにはどうすればよいですか?

注釈JsonUnwrappedをStudentのTeacher属性に追加します
つまり、ラップしないことを意味します。注釈JsonPropertyを使用して、Teacherの属性の名前を変更します。
サンプルコード
Student.java

@JsonUnwrapped
プライベート教師教師。
Teacher.java

@JsonProperty(“ teacher_name”)
プライベート文字列名;
@JsonProperty(“ teacher_age”)
プライベート整数年齢;
結果の例
[{ “ name”:“小明” “ age”:18、“ sex”:0、“ teacher_name”: "李先生"、 "教師_年齢":40、"父の名前":"王府桂" "生まれた時": "2020-09-13 20:21:53" }、{ "名前": " 小花"、"年齢" :16、"sex":1、"teacher_name": "Mr. Zhao"、"teacher_age":38、"father_name": "たくさんのお金"、"born_time": "2020-09-13 20:21:53" } ] 9カスタムシリアライザ9.1シナリオ年齢を理論上の学校の年齢に調整する必要がある場合、つまり理論上の学校の年齢を求めるために年齢から7を引く必要がある場合、どのようにすればよいですか?


















カスタム年齢シリアライザAgeSerializerを
作成し、StdSerializer <>を継承します。AgeSerializer の構築メソッドを作成し
、serialize関数を書き直し、
アノテーションを使用して、生徒属性age
9.2 指定するシリアライザAgeSerializer を修正します

パブリッククラスAgeSerializerはStdSerializerを拡張します{ protected AgeSerializer(){ super(Integer.class); }


@Override
public void serialize(Integer value, JsonGenerator gen, SerializerProvider provider) throws IOException {
    gen.writeNumber(value - 7);
}

}
Student.java

@JsonSerialize(using = AgeSerializer.class)
private Integer age;
9.3例の結果
[{ "name":"小明" "age":11、"sex":0、"teacher_name": "李老师"、"teacher_age" :40、"father_name": "Wang Fugui "、"born_time": "2020-09-13 20:31:59" }、{ "name": " 小花"、"age":9、"sex":1 、「Teacher_name」:「Teacher Zhao」、「teacher_age」:38、「father_name」:「大金」、「born_time」:「2020-09-13 20:31:59」}] 10 逆シリアル化10.1プロセスが最初文字列、byte []、ファイルバイナリなどのシリアル化されたデータが必要です。オブジェクトマッパーを作成します。jackson パッケージの下のObjectMapper が逆シリアル化関数を呼び出します。この例では、readValueが文字列をオブジェクトに変換します。10.2 アンチオブジェクトデータのシリアル化






















サンプルコード

public void testDeserializable()throws JsonProcessingException { String s =“ {“ name”:“ 小明 ”、“ age”:11、“ sex”:0、“ teacher_name”:“李老师”、“ teacher_age”:40、“ father_name ”:“王富贵”、“ born_time”:“ 2020-09-13 20:46:10”}”; ObjectMapper mapper = new ObjectMapper(); Student Student = mapper.readValue(s、Student.class); System.out.println(student); } 示例结果





Student {name = '小明'、age = 11、sex = MALE、fatherName = '王富贵'、bornTime = Sun Sep 13 20:46:10 CST 2020、Teacher = Teacher {name = '李老师'、age = 40 }}
分析

オブジェクトデータの印刷を容易にするために、StudentおよびTeacherのtoStringメソッドが書き換えられてい
ます。データから、経過時間の結果が間違っていることがわかります。これは、以前のカスタムシリアライザが経過時間を7に短縮し、セクション10.4が合格するためです。この問題を解決するためのカスタムデ
シリアライザー10.3オブジェクト配列データのデシリアライズ
サンプルコード

public void testDeserializableStudents()throws JsonProcessingException { String s = "[{" name ":" 小明 "、" age ":11、" sex ":0、" teacher_name ":" Teacher Li "、" teacher_age ":40、" father_name ":" Wang Fugui "、" born_time ":" 2020-09-13 20:51:31 "}、{" name ":"小花 "、" age ":9、" sex ":1、" teacher_name " : "Thaer Zhao"、 "teacher_age":38、 "father_name": "大金"、 "born_time": "2020-09-13 20:51:31"}] "; ObjectMapper mapper = new ObjectMapper(); Student [] student = mapper.readValue(s、Student []。class); for(学生:学生){ System.out.println(student); } } サンプル結果







Student {name = '小明'、age = 11、sex = MALE、fatherName = '王富贵'、bornTime = Sun Sep 13 20:51:31 CST 2020、Teacher = Teacher {name = '李老师'、age = 40 }}
Student {name = '小花'、age = 9、sex = FEMALE、fatherName = '大金'、bornTime = Sun Sep 13 20:51:31 CST 2020、teacher = Teacher {name = '赵老师'、年齢= 38}}
分析

readValueの2番目のパラメータは、型を渡す必要がある。それは、ここで配列を使用することをお勧めしますが、リストを使用しない。具体的な理由は、私が勉強する時間費やしていないことである
10.4カスタムデシリアライザを
。それは、セクション10.2および10.3現象から見ることができ、唯一のカスタムシリアライザーを使用すると、シリアル化プロセスは正常に行われ、逆シリアル化プロセスは依然としてデフォルトのロジックであり、予期しない結果になることがあります。

このシナリオでは、カスタムデシリアライザを検討できます

カスタムデシリアライザーAgeDeserializerを作成し、StdDeserializer <>を継承してdeserialize
メソッドをオーバーライドし、
JsonDeserializeアノテーションを生徒の年齢属性に追加して、デシリアライザーAgeDeserializer
サンプルコードを指定します。

AgeDeserializer.java

public class AgeDeserializer extends JsonDeserializer { @Override public Integer deserialize(JsonParser p、DeserializationContext ctxt)throws IOException、JsonProcessingException { return p.getIntValue()+ 7; } } Student.java





@JsonSerialize(using = AgeSerializer.class)
@JsonDeserialize(using = AgeDeserializer.class)
private Integer age;
表示例结果

Student {name = '小明'、age = 18、sex = MALE、fatherName = '王富贵'、bornTime = Sun Sep 13 20:51:31 CST 2020、teacher = Teacher {name = '李老师'、age = 40 }}
Student {name = '小花'、age = 16、sex = FEMALE、fatherName = '大金'、bornTime = Sun Sep 13 20:51:31 CST 2020、teacher = Teacher {name = '赵老师'、年齢= 38}}
11アノテーションJsonInclude
このアノテーションは、@ JsonInclude(value = JsonInclude.Include.NON_DEFAULT)の形式でエンティティクラスで使用されます。

このうち、インクルードには7つのパラメーターがあり、機能の比較は次のとおりです。

パラメータ関数の注意
Include.ALWAYSプロパティは常にシリアル化されます(getメソッドが必要です)デフォルト値の
Include.NON_DEFAULTプロパティは、シリアル化されていないデフォルト値です。たとえば、int:0、bool:false
Include.NON_EMPTYプロパティは空( "")またはnullです。
Include.NON_NULLをシリアル化しないでください。属性はnull
です
。Include.CUSTOMInclude.USE_DEFAULTSを
シリアル化しないでください。Include.NON_ABSENT
コード例
Student.java

@JsonInclude(value = JsonInclude.Include.NON_DEFAULT)
public class Student { public void testNonDefault()throws IOException { Student student = new Student( ""、0、null、null、null、null); ObjectMapper mapper = new ObjectMapper(); 文字列s = mapper.writeValueAsString(student); System.out.println(s); } 示例输出{ “ name”:“”、“ age”:-7 } 分析龙华大道1号http://www.kinghill.cn/LongHuaDaDao1Hao/index.html












おすすめ

転載: blog.csdn.net/weixin_45032957/article/details/108575263