Java Jackson Annotations (Ek Aciklamalar)

Java için JSON kütüphanesi olan Jackson‘ın annotationları hakkında genel bilgi.

Jackson Serialization (Serileştirme) Annotations

@JsonAnyGetter

Java’da bulunan Map veri tipini JSON’a dönüştürmek için kullanılır.

public class Model {
    public Integer id;
    private Map<String, String> settings;

    @JsonAnyGetter
    public Map<String, String> getSettings() {
        return settings;
    }
}

Çıktı:

{
    "id": 2,
    "key1": "value1",
    "key2": "value2"
}

@JsonPropertyOrder

Json çıktısının anahtarlarını sıralamak için kullanılır.

@JsonPropertyOrder({"name", "id", "age"})
public class Model {
    public Integer id;
    public String name;
    public Integer age;
}

Çıktı:

{
    "name": "Jack",
    "id": 2,
    "age": 23
}

@JsonRawValue

Verilen String değeri JSON olarak kullanmak için kullanılır.

public class Model {
    public int id;

    @JsonRawValue
    public String json;

    Model(int id, String json) {
        this.id = id;
        this.json = json;
    }
}

Model model = new Model(1, "{\"age\": 22}");

Çıktı:

{
    "id": 1,
    "json": {
        "age": 22
    }
}

@JsonValue

Tüm örneği serileştirmek için kullanılacak tek bir yöntem belirtmek için kullanılır.

public class Model {
    private int id;
    private String name;

    @JsonValue
    public String toJson() {
        return name + " - " + id;
    }
}

Çıktı:

"Jack - 1"

@JsonRootName

JSON çıktısına ana anahtar vermek için kullanılır.

@JsonRootName(value = "customer")
public class Model {
    private int id;
    private String name;
}

Çıktı:

{
    "customer": {
        "id": 1,
        "name": "Jack"
    }
}

Jackson Deserialization Annotations

@JsonCreator

Okumak istediğimiz JSON değeri modelimizdeki anahtarlardan farklı bir anahtar içeriyorsa, modelin kurucusu aracılığıyla okuduğumuz JSON’un doğru şekilde alınmasını sağlar.

Okumak istediğimiz JSON:

{
    "id": 1,
    "theName": "Jack"
}

theName alanı modelimizde name olarak geçtiği için okuma gerçekleşmez. Bunu düzeltmek için:

public class Model {
    public int id;
    public String name;
    
    @JsonCreator
    public Model(@JsonProperty("id") int id, @JsonProperty("theName") String name) {
        this.id = id;
        this.name = name;
    }
}

@JsonAnySetter

@JsonAnyGetter açıklamasının yaptığı işin tersini yapar. Okunan JSON’daki modelde bulunan anahatarları doğru şekilde atadıktan sonra, kalan anahtarları ve değerleri bir Map nesnesine atar.

public class Model {
    public int id;
    private Map<String, String> settings;

    @JsonAnySetter
    public void add(String key, String value) {
        settings.put(key, value);
    }
}

Okunan JSON:

{
    "id": 1,
    "key1": "value1",
    "key2": "value2"
}

id haricindeki anahtarlar ve değerler settings‘e atanır.

@JsonIgnoreProperties

JSON verisinde gözükmesi istenmeyen anahtarlar belirtilir.

@JsonIgnoreProperties({"id"})
public class Model {
    public int id;
    public String name;
}

Çıktı:

{
    "name": "Jack"
}

@JsonIgnore

JSON verisinde gözükmesi istenmeyen anahtarlar özel olarak belirtmek istenirse kullanılır.

public class Model {
    @JsonIgnore
    public int id;

    public String name;
}

Çıktı:

{
    "name": "Jack"
}

@JsonInclude

JSON verisinde hangi tür verilerin bulunacağını belirtmek için kullanılır.

@JsonInclude(Include.NON_NULL)
public class Model {
    public int id;
    public String name;
}
Model model = new Model(1, null);

Çıktı:

{
    "id": 1
}

name anahtarı null değere sahip olduğu için çıktıda gözükmeyecek. Yukarıda sadece NON_NULL yani null olmayan değerler gözükmesini istedik.