目次
理由:
このエラーは通常、Gson や Jackson などの JSON 解析ライブラリを使用して JSON 文字列を Java オブジェクトに変換するときに、Java オブジェクトに非静的内部クラス (つまり、ネストされたクラス) が含まれており、解析ライブラリがそれを変換できないことが原因で発生します。インスタンスによって引き起こされる非静的内部クラスを作成します。
非静的内部クラスは外部クラスのインスタンスの存在に依存するため、非静的内部クラスのインスタンスを作成する場合は、最初に外部クラスのインスタンスを作成する必要があります。JSON 解析ライブラリは Java オブジェクトを作成するときに、Java クラスのデフォルト コンストラクターを呼び出してオブジェクトを作成するだけで、外部クラスのインスタンスは作成しないため、非静的内部クラスのインスタンスは作成できません。
この問題を解決するには 2 つの方法があります。
-
オブジェクトを直接作成できるように、非静的内部クラスを静的内部クラスまたは別の外部クラスに変更します。
-
非静的内部クラスの逆シリアル化を処理するように JsonDeserializer をカスタマイズします。具体的には、外部クラスのインスタンスを JsonDeserializer で手動で作成し、非静的内部クラスのコンストラクターに渡してオブジェクトを作成する必要があります。サンプルコードは次のとおりです。
public class MyDeserializer implements JsonDeserializer<MyClass> {
@Override
public MyClass deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
JsonObject jsonObject = json.getAsJsonObject();
String name = jsonObject.get("name").getAsString();
int age = jsonObject.get("age").getAsInt();
JsonObject innerObject = jsonObject.get("inner").getAsJsonObject();
InnerClass inner = context.deserialize(innerObject, InnerClass.class);
MyClass myClass = new MyClass(name, age, inner);
myClass.setOuter(new OuterClass());
return myClass;
}
}
テストに関するトリビア:
テストクラスで main メソッドを作成し、次に内部クラス A を作成しました。
次に、メインメソッドでは、データオブジェクトデータが指定されたAオブジェクト形式のマッピングに変換され、Aの内部クラスはStaticを追加しません(うっかり、いつ静的がドロップされたかに注意を払いませんでした)
JSON.toJSONString(data), A.class);