Jacksonによるenumのデシリアライズ
2023-09-06 21:58:16
質問
私は Jackson 2.5.4 で enum をデシリアライズしようとして失敗しています。私の入力文字列はキャメルケースで、私は単純に標準の Enum 規則にマッピングしたいのです。
@JsonFormat(shape = JsonFormat.Shape.STRING)
public enum Status {
READY("ready"),
NOT_READY("notReady"),
NOT_READY_AT_ALL("notReadyAtAll");
private static Map<String, Status> FORMAT_MAP = Stream
.of(Status.values())
.collect(toMap(s -> s.formatted, Function.<Status>identity()));
private final String formatted;
Status(String formatted) {
this.formatted = formatted;
}
@JsonCreator
public Status fromString(String string) {
Status status = FORMAT_MAP.get(string);
if (status == null) {
throw new IllegalArgumentException(string + " has no corresponding value");
}
return status;
}
}
また
@JsonValue
も試してみましたが、これは他の場所で報告されたオプションで、無駄でした。それらはすべてで吹き飛びます。
com.fasterxml.jackson.databind.exc.InvalidFormatException: Can not construct instance of ...Status from String value 'ready': value not one of declared Enum instance names: ...
私は何を間違えているのでしょうか?
どうすればいいのでしょうか?
EDITです。
Jackson 2.6以降では、以下のように
@JsonProperty
を使用して、シリアライズ/デシリアライズの値を指定することができます (
はこちら
):
public enum Status {
@JsonProperty("ready")
READY,
@JsonProperty("notReady")
NOT_READY,
@JsonProperty("notReadyAtAll")
NOT_READY_AT_ALL;
}
(この回答の残りの部分は、古いバージョンのJacksonでも有効です)
あなたは
@JsonCreator
を受け取る静的メソッドにアノテートします。
String
引数を受け取る静的メソッドにアノテーションを付けることができます。これは、Jackson が
ファクトリーメソッド
:
public enum Status {
READY("ready"),
NOT_READY("notReady"),
NOT_READY_AT_ALL("notReadyAtAll");
private static Map<String, Status> FORMAT_MAP = Stream
.of(Status.values())
.collect(Collectors.toMap(s -> s.formatted, Function.identity()));
private final String formatted;
Status(String formatted) {
this.formatted = formatted;
}
@JsonCreator // This is the factory method and must be static
public static Status fromString(String string) {
return Optional
.ofNullable(FORMAT_MAP.get(string))
.orElseThrow(() -> new IllegalArgumentException(string));
}
}
これはテストです。
ObjectMapper mapper = new ObjectMapper();
Status s1 = mapper.readValue("\"ready\"", Status.class);
Status s2 = mapper.readValue("\"notReadyAtAll\"", Status.class);
System.out.println(s1); // READY
System.out.println(s2); // NOT_READY_AT_ALL
ファクトリーメソッドは
String
を想定しているので、JSONで有効な文字列の構文、つまり値を引用符で囲むことを使わなければなりません。
関連
-
[解決済み] Java enumのメンバーを比較する:==またはequals()?
-
Java:未解決コンパイル問題の解決方法
-
java 365*1000*60*60*24 計算問題
-
[解決済み] cURLでJSONデータをPOSTするにはどうすればよいですか?
-
[解決済み] Mavenを使用して、依存関係を持つ実行可能なJARを作成するにはどうすればよいですか?
-
[解決済み] Javaで文字列値からenum値を取得する方法
-
[解決済み] JavaScriptSerializer - 列挙型を文字列としてJSONシリアライズする
-
[解決済み] Jackson を使用してオブジェクトの配列をデシリアライズする方法
-
[解決済み] シリアライズ中にフィールドの値が NULL の場合、それを無視するように Jackson に指示するにはどうすればよいですか?
-
[解決済み] Jackson JSONとHibernate JPAによる無限再帰の問題
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
NullPointerException - java.lang.
-
型に解決できない エラー解決
-
Collections.sortがdoubleでソートできない問題を完璧に解決する。
-
java.sql.SQLException: 結果セットの開始前
-
List list = new ArrayList(); Error: ArrayList は型に解決できません。
-
Javaがテキストファイルを読み込む
-
Java appears タイプEを囲むインスタンスがアクセスできない。
-
Java Runtime Environmentを継続するためのメモリが不足しています。
-
Java JDKのダイナミックプロキシ(AOP)の使用と実装の原理分析
-
Zipファイルの圧縮・解凍にantを使用する