5

これは、GSON を使用して消費しようとしている種類の JSON の例です。

{
    "person": {
        "name": "Philip"
        "father.name": "Yancy"
    }
}

この JSON を次の構造に逆シリアル化できるかどうか疑問に思っていました。

public class Person
{
    private String name;
    private Father father; 
}

public class Father
{
    private String name;
}

となることによって:

p.name == "Philip"
p.father.name == "Yancy"

現在@SerializedName、ピリオドを含むプロパティ名を取得するために使用しています。

public class Person
{
    private String name;

    @SerializedName("father.name")
    private String fathersName; 
}

しかし、それは理想的ではありません。

ドキュメントを見ると、すぐには可能ではないように見えますが、見逃しているものがあるかもしれません.GSONの使用は初めてです。

残念ながら、使用している JSON を変更することはできず、別の JSON 解析ライブラリに切り替えることに消極的です。

4

2 に答える 2

4

私が理解している限り、Gson は単一のフィールドとして理解するため、直接的に行うことはできません。father.name

独自のCustom Deserializerを作成する必要があります。Gson のユーザー ガイドの手順については、こちらを参照してください。

試したことはありませんが、それほど難しくはないようです。この投稿も参考になるかもしれません。

Gson のユーザー ガイドとその投稿のコードを見ると、次のようなものが必要になります。

private class PersonDeserializer implements JsonDeserializer<Person> {

  @Override
  public Person deserialize(JsonElement json, Type type,
        JsonDeserializationContext context) throws JsonParseException {

    JsonObject jobject = (JsonObject) json;

    Father father = new Father(jobject.get("father.name").getAsString());

    return new Person(jobject.get("name").getAsString(), father);
  }  
}

適切なコンストラクターがあると仮定します...

その後:

GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(Person.class, new PersonDeserializer());
Gson gson = gsonBuilder.create();
Person person = gson.fromJson(jsonString, Person.class);

Personそして、Gson は、JSON をオブジェクトに逆シリアル化するために、デシリアライザーを呼び出します。

注: このコードは試していませんが、このようなものか、非常によく似たものになるはずです。

于 2013-04-24T15:31:43.697 に答える