Если по умолчанию вы не хотите сериализовать нули, вы можете сообщить 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;
Надеется, что это помогает! :-)
Ничего себе. Это было замечательно –
Знаете ли вы, можно ли избежать повторной реализации сериализации адреса в примере? Я хочу установить JsonToken.NULL, когда адрес имеет значение NULL, в противном случае я хотел бы продолжить как обычно, используя встроенный сериализатор gson. –