2016-10-25 8 views
4

私はGsonとVolleyを使用します。 私は人物オブジェクトを持っています。私は性別を設定したい、文字列ではなく、列挙型を設定したいと思います。 私はこのフィールドだけのためのカスタムデシリアライザを書いて、Gsonに残りをさせたいと思います。 どうすればいいですか?フィールド上のGsonカスタムデシリアライザ

答えて

4

サンプルの呼び出しによるカスタムデシリアライズ(ジェンダー用)のコードは次のとおりです。

1)性別デシリアライザ大文字と小文字を区別しない

2)扱う無効値(すなわち、入力JSONは、雄と雌以外含ま)

メイン方法: -

public static void main(String[] args) { 
     String jsonString = "{'firstName' : 'john','lastName' : 'stones','gender' : 'male'}"; 
     Gson gson = new GsonBuilder() 
       .registerTypeAdapter(Person.class, new PersonModelDeserializer()) 
       .create(); 

     Person person = gson.fromJson(jsonString, Person.class); 
     System.out.println(person.toString()); 

    } 

性別列挙型: -

public enum Gender { 
    MALE, FEMALE 
} 

デシリアライザ: - 入力JSONは、男性または女性を持っていない場合は

valueOf方法は、同様に処理されたIllegalArgumentExceptionをスローします。

ジェンダーの逆シリアル化でも大文字と小文字は区別されません。

public class PersonModelDeserializer implements JsonDeserializer<Person> { 

    @Override 
    public Person deserialize(JsonElement paramJsonElement, Type paramType, 
      JsonDeserializationContext paramJsonDeserializationContext) throws JsonParseException { 

     Person person = new Gson().fromJson(paramJsonElement.getAsJsonObject(), Person.class); 

     try { 
      Gender gender = null; 
      if (paramJsonElement.getAsJsonObject().get("gender") != null) { 
       gender = Gender.valueOf(paramJsonElement.getAsJsonObject().get("gender").getAsString().toUpperCase()); 
      } 

      person.setGender(gender); 
     } catch (IllegalArgumentException ie) { 
      System.out.println(ie.getMessage()); 
      System.out.println("Gender cannot be serialized .."); 
     } 

     return person; 
    } 

} 

Personクラス: -

public class Person implements Serializable{ 
    private static final long serialVersionUID = 5447375194275313051L; 

    private String firstName; 
    private String lastName; 

    private Gender gender; 

    ... getters and setters 
} 
関連する問題