2016-01-12 2 views
2

Я хотел бы сериализовать нуль только для одного типа в моем теле JSON, который работает в PUT. Я не хочу сериализовать нули для любых других типов объектов. У меня есть что-то вроде этого:Адаптер адаптивного адаптера Gson для сериализации нуля только для одного типа объекта?

public class Patient { 
    public Address address; 
    public String first_name; 
    public String last_name; 
} 

и я хочу только сериализовать адрес, если адрес пуст. Так, например

Patient patient = new Patient(); 
patient.address = null; 
patient.last_name = "Doe"; 

будет выглядеть примерно так:

"address":null, 
"last_name":"Doe" 

Где-адрес присваивается нулевым, пациент кончил объект, так как по умолчанию Gson не сериализовать аннулирует чего я хочу, и фамилия сохраняет присвоенное строковое значение.

Есть ли адаптер адаптера Gson, который я мог бы использовать?

public class GsonCustomAdapter extends TypeAdapter<Address> 

Я не знаком с этой концепцией и пытаюсь понять ее на некоторое время. Буду признателен за любую оказанную помощь.

ответ

6

Если по умолчанию вы не хотите сериализовать нули, вы можете сообщить JsonWriter, чтобы сериализовать его, только если вы действительно читаете экземпляр Address.

Давайте предположим, что следующий класс:

class Address { 
    public String country = "UK"; 
    public String city = "London"; 
} 

Теперь мы создаем специальный адаптер типа для Address класса. Здесь вы прямо указываете, что даже если JsonWriter не должен указывать значения null в ответе, вы разрешаете это делать только для поля Address (см. Комментарии в коде).

class AddressAdapter extends TypeAdapter<Address> { 
    @Override 
    public void write(JsonWriter out, Address address) throws IOException { 
     if (address == null) { 
      //if the writer was not allowed to write null values 
      //do it only for this field 
      if (!out.getSerializeNulls()) { 
       out.setSerializeNulls(true); 
       out.nullValue(); 
       out.setSerializeNulls(false); 
      } else { 
       out.nullValue(); 
      } 
     } else { 
      out.beginObject(); 
      out.name("country"); 
      out.value(address.country); 
      out.name("city"); 
      out.value(address.city); 
      out.endObject(); 
     } 
    } 

    @Override 
    public Address read(JsonReader in) throws IOException { 
     if(in.peek() == JsonToken.NULL) { 
      in.nextNull(); 
      return null; 
     } 
     in.beginObject(); 
     Address address = new Address(); 
     in.nextName(); 
     address.country = in.nextString(); 
     in.nextName(); 
     address.city = in.nextString(); 
     in.endObject(); 
     return address; 
    } 
} 

Теперь вы должны зарегистрировать этот адаптер, так что синтаксический анализатор знает, что он должен использовать его при сериализации/десериализации Address поле. Для этого используйте аннотацию @JsonAdapter.

class Patient { 
    @JsonAdapter(AddressAdapter.class) 
    public Address address; 
    public String first_name; 
    public String last_name; 
} 

И все готово!

Например, давайте пациент в вашем примере:

Patient patient = new Patient(); 
patient.last_name = "Doe"; 

С анализатором набором для сериализации нулевых значений, вы получите:

{"address":null,"first_name":null,"last_name":"Doe"} 

Когда вы не позволяете его (устанавливаются по умолчанию):

{"address":null,"last_name":"Doe"} 

путем установки адреса для пациента:

patient.address = new Address(); 
... 
{"address":{"country":"UK","city":"London"},"last_name":"Doe"} 

Как примечание, если вы хотите, чтобы придерживаться правил именования на стороне Java, вы можете использовать аннотацию @SerializedName, например:

@SerializedName("first_name") public String firstName; 
@SerializedName("last_name") public String lastName; 

Надеется, что это помогает! :-)

+0

Ничего себе. Это было замечательно –

+0

Знаете ли вы, можно ли избежать повторной реализации сериализации адреса в примере? Я хочу установить JsonToken.NULL, когда адрес имеет значение NULL, в противном случае я хотел бы продолжить как обычно, используя встроенный сериализатор gson. –

Смежные вопросы