寒い春の夜、ついにレベル33に到達しました。プログラマーの手をこすりながら、私はすでに JSON のシリアル化と逆シリアル化の分野全体を受け入れる準備をしていましたが、残念ながら、何も理解できませんでした。講義の内容は覚えていませんでしたが、問題はなんとなく直感的に解けました。この点で、私は Jackson Framework の荒野を詳しく調べて、この JSON が何であるかを理解することにしました。
私のすべての知識を、カンニングペーパー形式で実践的かつ簡潔に提示しようとします(私自身と読者の両方のために)。 ジャクソンの注釈への旅。 JSON への途中で最初に遭遇するのは @JsonAutoDetect アノテーションです。一見すると簡単な要約ですが、著者はこれを理解するのに最も時間がかかりました。要約には必要なメソッドが 5 つあります。
- fieldVisibility () - 指定されたアクセス修飾子を持つフィールドのみをシリアル化します。
- getterVisibility()/setterVisibility() - getter/setter が指定されたアクセス修飾子を持つフィールドをシリアル化します。
- isGetterVisibility() - ブールゲッターの個別の実装
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.PUBLIC_ONLY,
getterVisibility = JsonAutoDetect.Visibility.PUBLIC_ONLY,
setterVisibility = JsonAutoDetect.Visibility.PUBLIC_ONLY,
isGetterVisibility = JsonAutoDetect.Visibility.PROTECTED_AND_PUBLIC)
public class HeadClass {
public String name;
private Map<String, String> properties;
public Queue<String> queue;
protected List<String> list;
private int age;
private int number;
private boolean isHead;
protected HeadClass(int age) {
this.age = age;
}
public HeadClass() {}
Map<String, String> getProperties() {
return properties;
}
protected boolean isHead() {
return isHead;
}
protected void setProperties(Map<String, String> properties) {
this.properties = properties;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
}
isGetterVisibility を削除したらどうなるでしょうか? リストされている 4 つの方法でシリアル化プロセスが構成されました。5 番目は、逆シリアル化プロセスを制御します。
- CreatorVisibility() は理解するのが最も難しいメソッドです。これは、コンストラクターとファクトリ メソッド (呼び出されたときにオブジェクトを作成するメソッド) で動作します。例を見てみましょう:
@JsonAutoDetect(creatorVisibility = JsonAutoDetect.Visibility.PROTECTED_AND_PUBLIC)
public class HeadClass {
public String name;
public int id;
HeadClass(@JsonProperty(value = "name") String name, @JsonProperty(value = "id") int id) {
this.name = name;
this.id = id;
}
protected HeadClass(String name) {
this.name = name;
this.id = 123;
}
protected HeadClass(int id) {
this.id = id;
this.name = "Yes!";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
String forDeserialize = "{\"name\":\"No!\",\"id\":123}";
StringReader reader = new StringReader(forDeserialize);
HeadClass headClass1 = (HeadClass) mapper.readValue(reader, HeadClass.class);
}
逆シリアル化メカニズムに関する重要な注意事項! JSON からオブジェクトを作成しようとすると、必要なクラスのコンストラクターが、JSON オブジェクトと同じパラメーターのセットで検索されます。上の例では、JSON オブジェクトは 2 つのパラメーター、name、id で構成されています。どのコンストラクターを呼び出すかを推測してください。そして、はい、このコードをコンパイルするとエラーがスローされます。なぜでしょうか? コンストラクターの可視性を制限しているためです (保護された public 修飾子を持つコンストラクターのみが表示されます)。CreatorVisibility を削除すると機能します。という疑問が生じます。コンストラクターの @JsonProperty とは何ですか? これについては記事の次の部分でお話したいと思います。 PS紳士の皆様、この記事について少なくとも何らかの反応をいただきたいと思っています。たくさんのトピックがあり、どれも非常に興味深いので、このトピックに需要があるのか、続ける価値があるのかどうか疑問に思います。@JsonView、@JsonManagedReference、@JsonBackReference、@JsonUnwrapped などのアノテーションも検討したいと思います。ありがとう :)
GO TO FULL VERSION