これは、 Gsonを使用して、JSON 表現との間でオブジェクトをシリアル化および逆シリアル化することで実行できます。Gson には、汎用オブジェクトを処理できるシリアライザーとデシリアライザーが組み込まれていますが、何か特別なものが必要な場合は、独自のものを実装できます。質問で言及されている例では、クラスに引数のないコンストラクターがある場合、汎用シリアライザーとデシリアライザーはおそらく機能します。
必要なことを行う簡単な方法は次のとおりです。
public class Person {
private String name;
private int age;
private Person parent = null;
public Person() {
// Required no-args constructor for Gson.
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
シリアル化
Person joe = new Person("Joe", 20);
Gson gson = new Gson();
String json = gson.toJson(joe);
==> json is {"name":"Joe","age":"20"}
無限再帰が発生するため、循環参照を使用してオブジェクトをシリアル化できないことに注意してください。また、親が無期限にインスタンス化されるため、質問で提供されている例は不可能です。
逆シリアル化
Person joe = gson.fromJson(json, Person.class);
これ以上のカスタムが必要な場合は、カスタムのシリアライゼーションとデシリアライゼーションを使用できます。ユーザーガイドから:
カスタムのシリアライゼーションとデシリアライゼーション
場合によっては、デフォルトの表現が必要なものではないことがあります。これは、ライブラリ クラス (DateTime など) を扱う場合によくあります。Gson を使用すると、独自のカスタム シリアライザーとデシリアライザーを登録できます。これは、次の 2 つの部分を定義することによって行われます。 Json Serialiers: オブジェクトのカスタム シリアライゼーションを定義する必要があります。 Json Deserializers: 型のカスタム デシリアライゼーションを定義する必要があります。
GsonBuilder gson = new GsonBuilder();
gson.registerTypeAdapter(MyType2.class, new MyTypeAdapter());
gson.registerTypeAdapter(MyType.class, new MySerializer());
gson.registerTypeAdapter(MyType.class, new MyDeserializer());
gson.registerTypeAdapter(MyType.class, new MyInstanceCreator());
registerTypeAdapter 呼び出しは、型アダプターがこれらのインターフェイスを複数実装しているかどうかを確認し、それらすべてに登録します。
シリアライザーの作成
JodaTime DateTime クラスのカスタム シリアライザーを作成する方法の例を次に示します。
private class DateTimeSerializer implements JsonSerializer<DateTime> {
public JsonElement serialize(DateTime src, Type typeOfSrc,
JsonSerializationContext context) {
return new JsonPrimitive(src.toString());
}
}
Gson は、シリアル化中に DateTime オブジェクトに遭遇すると toJson() を呼び出します。
デシリアライザーの作成
JodaTime DateTime クラスのカスタム デシリアライザーを記述する方法の例を次に示します。
private class DateTimeDeserializer implements
JsonDeserializer<DateTime> {
public DateTime deserialize(JsonElement
json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException {
return new DateTime(json.getAsJsonPrimitive().getAsString());
}
}
JSON 文字列フラグメントを DateTime オブジェクトに逆シリアル化する必要がある場合、Gson は fromJson() を呼び出します。