[解決済み] GSONでJSONをパースする際のEnumの使用について
2022-05-14 10:41:07
質問
これは、以前ここで質問したことに関連するものです。
同じJSONをパースしようとしていますが、今は少しクラスを変えています。
{
"lower": 20,
"upper": 40,
"delimiter": " ",
"scope": ["${title}"]
}
私のクラスは今、次のようになります。
public class TruncateElement {
private int lower;
private int upper;
private String delimiter;
private List<AttributeScope> scope;
// getters and setters
}
public enum AttributeScope {
TITLE("${title}"),
DESCRIPTION("${description}"),
private String scope;
AttributeScope(String scope) {
this.scope = scope;
}
public String getScope() {
return this.scope;
}
}
このコードは例外を投げます。
com.google.gson.JsonParseException: The JsonDeserializer EnumTypeAdapter failed to deserialized json object "${title}" given the type class com.amazon.seo.attribute.template.parse.data.AttributeScope
at
この例外は理解できます。というのも、前回の質問の解答にあるように、GSONはEnumオブジェクトが、実際には
${title}("${title}"),
${description}("${description}");
しかし、これは構文上不可能なので、推奨される解決策や回避策は何でしょうか?
どのように解決するのですか?
から Gsonのドキュメント :
<ブロッククオートGson は Enum のデフォルトのシリアライズとデシリアライズを提供します。もし、デフォルトの表現を変更したい場合は、GsonBuilder.registerTypeAdapter(Type, Object)でタイプアダプタを登録することで変更することが可能です。
以下はそのようなアプローチの1つです。
import java.io.FileReader;
import java.lang.reflect.Type;
import java.util.List;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
public class GsonFoo
{
public static void main(String[] args) throws Exception
{
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(AttributeScope.class, new AttributeScopeDeserializer());
Gson gson = gsonBuilder.create();
TruncateElement element = gson.fromJson(new FileReader("input.json"), TruncateElement.class);
System.out.println(element.lower);
System.out.println(element.upper);
System.out.println(element.delimiter);
System.out.println(element.scope.get(0));
}
}
class AttributeScopeDeserializer implements JsonDeserializer<AttributeScope>
{
@Override
public AttributeScope deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException
{
AttributeScope[] scopes = AttributeScope.values();
for (AttributeScope scope : scopes)
{
if (scope.scope.equals(json.getAsString()))
return scope;
}
return null;
}
}
class TruncateElement
{
int lower;
int upper;
String delimiter;
List<AttributeScope> scope;
}
enum AttributeScope
{
TITLE("${title}"), DESCRIPTION("${description}");
String scope;
AttributeScope(String scope)
{
this.scope = scope;
}
}
関連
-
java.util.NoSuchElementException 原因解析と解決方法
-
javaコンパイル時のエラー:不正な文字 '\ufeff' に対する解決策です。
-
ローカルリソースのロードが許可されていない場合の解決策
-
[解決済み] なぜGoogleはJSONレスポンスにwhile(1);を前置するのでしょうか?
-
[解決済み] cURLでJSONデータをPOSTするにはどうすればよいですか?
-
[解決済み] JavaScriptでJSONをきれいに印刷する
-
[解決済み] Mavenを使用して、依存関係を持つ実行可能なJARを作成するにはどうすればよいですか?
-
[解決済み] Chromeを使用してASP.NET Web APIがXMLの代わりにJSONを返すようにするにはどうすればよいですか?
-
[解決済み] UnixツールでJSONをパースする
-
[解決済み] GsonでList<T>オブジェクトをデシリアライズする?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
エラーが報告されました。リソースの読み込みに失敗しました:サーバーは500(内部サーバーエラー)のステータスで応答しました。
-
アクセス制限について アプリケーションの種類がAPIでない(必要なライブラリの制限)。
-
jd-gui Java Exceptionが発生しました。
-
final, finally, finalizeの違いについて話してください。
-
SpringBootApplication を型解決できない。
-
javaの模造品QQ WeChatのチャットルーム
-
linux run jarfile Invalid or corrupt jarfile error.
-
Eclipse起動エラー:javaは起動したが、終了コード=1を返した(ネット上の様々な落とし穴)
-
あるコードに出会いましたが、何に使うのか理解できません。 List<String> list = new ArrayList<String>() { { a
-
ブラウザでの大容量ファイルスライスアップロード(Javaサーバサイド実装)