![](/img/trans.png)
[英]GSON: serialize/deserialize object of class, that have registered type hierarchy adapter, using ReflectiveTypeAdapterFactory.Adapter
[英]Gson custom type adapter to serialize null on one object type only?
我想在我的JSON主體中僅對一個PUT上的一個類型序列化null。 我不想為對象中的任何其他類型序列化null。 我有這樣的事情:
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"
如果將地址指定為null,則患者不會離開對象,因為默認情況下Gson不會序列化我想要的空值,並且姓氏保留指定的字符串值。
我可以使用Gson自定義類型適配器嗎?
public class GsonCustomAdapter extends TypeAdapter<Address>
我對這個概念並不熟悉,並且一直試圖理解它。 任何幫助深表感謝。
如果,默認情況下,您不希望序列化空值,則只有在實際讀取Address
實例時才能告訴JsonWriter
序列化它。
我們假設以下課程:
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;
希望能幫助到你 ! :-)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.