Eu tenho um objeto para serializar usando Gson
:
class User {
String firstname;
String lastname;
JsonElement opaqueData;
}
No nível objeto superior, quero Gson
ignorar null
campos (digamos, se lastname
é null
, não deve ser serializado).
Mas no campo opaqueData
, eu quero null
s para ser serializado, uma vez que é suposto que um bloco de dados opaco. Então, usando new GsonBuilder().serializeNulls().create().toJson(user)
não iria funcionar.
Mas @JsonAdapter
não quer trabalhar
class User {
String firstname;
String lastname;
@JsonAdapter(NullAdapter.class)
JsonElement opaqueData;
}
class NullAdapter extends TypeAdapter<JsonElement> {
@Override
public void write(JsonWriter out, JsonElement value) throws IOException {
out.jsonValue(new GsonBuilder().serializeNulls().create().toJson(value));
}
@Override
public JsonElement read(JsonReader in) throws IOException {
// TODO Auto-generated method stub
return null;
}
}
Parece que o adaptador é ignorado pelo Gson.
É este o comportamento esperado? Como pode fazer isso acontecer sem criar um adaptador para toda a classe de usuário, em seguida, manualmente serializar cada campo?
Gson
não se preocupa em adaptar seu tipo de dados interna JsonElement
. Eu não sei se há qualquer ponto desde JsonElement
tipo é o resultado adaptada.
Ter um olhar para o código-fonte do Gson você pode ver, existem dois métodos de nível superior:
Para qualquer objeto
public String toJson(Object src) {
if (src == null) {
return toJson(JsonNull.INSTANCE);
}
return toJson(src, src.getClass());
}
Eu acho que é óbvio sem copiar o resto do código que método acima se tenha busca e configuração de adaptadores (e consulta de fábricas adaptador) em seu caminho de execução. Mas, em seguida, também há método como:
para JsonElement
public String toJson(JsonElement jsonElement) {
StringWriter writer = new StringWriter();
toJson(jsonElement, writer);
return writer.toString();
}
e para isso o caminho de execução não há pesquisa nem configurar quaisquer adaptadores que JsonElement
não se destina a ser adaptada mais.
Então, quando Gson
atinge qualquer JsonElement
apenas serializa ti como string formatada e você não pode afetar em que wiht qualquer adaptador.
Se você realmente precisa para serialize algo assim talvez você poderia fazer uma classe wrapper para o JsonElement
, algo como:
public class JsonElementWrapper {
public JsonElement jsonElement;
}
e ajustar o seu TypeAdapter
para se adaptar isso para `null``or valor real.