Java
 Computer >> コンピューター >  >> プログラミング >> Java

【Java】Jacksonの@JsonPropertyOrderアノテーションでJSONプロパティの出力順序を制御する方法

JavaでJSONを扱う際に広く使われているJacksonライブラリでは、デフォルトでオブジェクトのプロパティが定義順やアルファベット順とは限らない順序でシリアライズされることがあります。出力されるJSONのキー順序を明示的に制御したい場合は、@JsonPropertyOrderアノテーションを使用します。

@JsonPropertyOrderクラスレベルで付与するアノテーションです。引数としてフィールド名のリストを指定することで、オブジェクトをJSONにシリアライズした際の出力文字列におけるプロパティの表示順序を定義できます。アノテーション内で宣言されたプロパティは最初に(指定した順序どおりに)出力され、その後に定義に含まれていない残りのプロパティが続けて出力されます。

構文

public @interface JsonPropertyOrder

コード例

以下の例では、Employeeクラスに対して@JsonPropertyOrderを付与し、「firstName」→「lastName」→「technologies」→「empId」の順にJSONを出力するよう指定しています。

import com.fasterxml.jackson.core.*;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import java.util.*;
import java.io.*;

public class JsonPropertyOrderTest {
    public static void main(String args[]) throws JsonGenerationException, JsonMappingException, IOException {
        Employee emp = new Employee();
        emp.setFirstName("Adithya");
        emp.setEmpId(25);
        emp.setLastName("Jai");
        emp.getTechnologies().add("Java");
        emp.getTechnologies().add("Scala");
        emp.getTechnologies().add("Python");

        ObjectMapper mapper = new ObjectMapper();
        mapper.writerWithDefaultPrettyPrinter().writeValue(System.out, emp);
    }
}

// Employeeクラス
@JsonPropertyOrder({
    "firstName",
    "lastName",
    "technologies",
    "empId"
})
class Employee {
    private int empId;
    private String firstName;
    private String lastName;
    private List<String> technologies = new ArrayList<>();

    public int getEmpId() {
        return empId;
    }
    public void setEmpId(int empId) {
        this.empId = empId;
    }
    public String getFirstName() {
        return firstName;
    }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
    public List<String> getTechnologies() {
        return technologies;
    }
    public void setTechnologies(List<String> technologies) {
        this.technologies = technologies;
    }
}

実行結果

プログラムを実行すると、@JsonPropertyOrderで指定した通りの順序でJSONが出力されます。

{
    "firstName" : "Adithya",
    "lastName" : "Jai",
    "technologies" : [ "Java", "Scala", "Python" ],
    "empId" : 125
}

補足:アルファベット順でソートしたい場合

個別に順序を指定するのではなく、すべてのプロパティをアルファベット順に出力したい場合は、@JsonPropertyOrder(alphabetic = true)のようにalphabetic属性をtrueに設定するだけで実現できます。


  1. Java OpenCVライブラリを使って画像の明るさを変更する方法

    OpenCVのorg.opencv.core.Matクラスが提供するconvertTo()メソッドを使うと、行列に対して必要な演算を実行し、画像のコントラストや明るさを簡単に調整できます。このメソッドは以下の4つのパラメータを受け取ります。 mat − 計算結果を格納するための空の行列。ソース行列と同じサイズ・型である必要があります。 rtype − 出力行列の型を指定する整数値。負の値を指定した場合は、ソース行列と同じ型になります。 alpha − ゲイン値。0より大きい値を指定します(デフォルトは1)。この値を変更するとコントラストに影響します。 beta − バイアス値(デフォルトは

  2. 【Java】OpenCVライブラリを使って画像のコントラストを変更する方法

    画像の明るさやコントラストの増減は、画像のピクセル値を変換することで実現できます。この変換は、次のような数式で表されます。g(i, j) = α ・ f(i, j) + βここで、各要素の意味は以下のとおりです。(i, j):ピクセルの位置(座標)α(ゲイン)と β(バイアス):変換のパラメータ一般に、ゲインパラメータ α が画像のコントラストを制御し、バイアスパラメータ β が画像の明るさを制御します。convertTo() メソッドについてorg.opencv.core.Mat クラスの convertTo() メソッドを使うと、指定した行列に対して必要な計算を実行し、画像のコントラストや