JavaのJacksonライブラリでカスタムシリアライザーを実装する方法
Jackson APIは、JSONデータを扱うための多彩なメソッドを提供しています。このAPIを利用することで、JavaオブジェクトをJSON文字列へ変換したり、逆にJSON文字列からオブジェクトを復元したりすることが可能です。
標準の変換処理だけでは要件を満たせない場合には、カスタムシリアライザーを実装することで、JSON出力の形式を自由に制御できます。実装にはStdSerializerクラスを継承し、serialize(T value, JsonGenerator gen, SerializerProvider provider)メソッドをオーバーライドします。
各引数の役割は以下のとおりです。
- value: シリアライズ対象の値(nullは許可されません)
- gen: 結果のJSONコンテンツを出力するために使用されるジェネレーター
- provider: オブジェクト値をシリアライズするためのシリアライザーを取得できるプロバイダー
構文
public abstract void serialize(T value, JsonGenerator gen, SerializerProvider provider) throws IOException
実装例
以下の例では、Userクラス用のカスタムシリアライザー「UserSerializer」を作成し、SimpleModule経由でObjectMapperに登録しています。これにより、オブジェクトを整形されたJSONとして出力できます。
import java.io.*;
import com.fasterxml.jackson.core.*;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.module.*;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
public class JacksonSerializeTest {
public static void main(String[] args) throws Exception {
JacksonSerializeTest test = new JacksonSerializeTest();
test.serialize();
}
public void serialize() throws Exception {
User user = new User();
user.setFirstName("Raja");
user.setLastName("Ramesh");
ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addSerializer(User.class, new UserSerializer());
mapper.registerModule(module);
String jsonStr = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(user); // 整形出力
System.out.println(jsonStr);
}
}
// Userクラス
class User implements Serializable {
private String firstName;
private String lastName;
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;
}
}
// UserSerializerクラス
class UserSerializer extends StdSerializer<User> {
public UserSerializer() {
this(null);
}
public UserSerializer(Class<User> t) {
super(t);
}
@Override
public void serialize(User value, JsonGenerator jgen, SerializerProvider provider)
throws IOException, JsonProcessingException {
jgen.writeStartObject();
jgen.writeStringField("firstName", value.getFirstName());
jgen.writeStringField("lastName", value.getLastName());
jgen.writeEndObject();
}
}
実行結果
{
"firstName" : "Raja",
"lastName" : "Ramesh"
}
ポイント解説
UserSerializerはStdSerializer<User>を継承し、デフォルトコンストラクタから引数付きコンストラクタを呼び出すのが定型的なパターンです。SimpleModuleにaddSerializer()でカスタムシリアライザーを登録し、そのモジュールをObjectMapperに登録することで有効化されます。writeStartObject()とwriteEndObject()でJSONオブジェクトの開始・終了を明示的に制御できるため、フィールド名や出力順序なども柔軟にカスタマイズ可能です。
-
JavaのOpenCVライブラリで画像の鮮明度(シャープネス)を変更する方法
画像をシャープにする(鮮鋭化)処理は、ぼかし処理とは正反対の操作です。OpenCVライブラリを使って画像の鮮明度を変更するには、まずガウシアンフィルタで元画像を平滑化(ぼかし)し、その平滑化した画像を元の画像から差し引きます。この手法は「アンシャープマスク」と呼ばれる、画像処理における定番のテクニックです。 処理の流れ Imgcodecs.imread() で対象となる画像をファイルから読み込みます。 Imgproc.GaussianBlur() を使って、画像をぼかしたコピーを作成します。 Core.addWeighted() で元画像とぼかし画像を加重合成し、ぼかし成分を差し引きながら輪
-
【Java】OpenCVライブラリを使って画像のコントラストを変更する方法
画像の明るさやコントラストの増減は、画像のピクセル値を変換することで実現できます。この変換は、次のような数式で表されます。g(i, j) = α ・ f(i, j) + βここで、各要素の意味は以下のとおりです。(i, j):ピクセルの位置(座標)α(ゲイン)と β(バイアス):変換のパラメータ一般に、ゲインパラメータ α が画像のコントラストを制御し、バイアスパラメータ β が画像の明るさを制御します。convertTo() メソッドについてorg.opencv.core.Mat クラスの convertTo() メソッドを使うと、指定した行列に対して必要な計算を実行し、画像のコントラストや