Does Gson ignorar @JsonAdapter em campos JsonElement?

wei:

Eu tenho um objeto para serializar usando Gson:

class User {
    String firstname;
    String lastname;
    JsonElement opaqueData;
}

No nível objeto superior, quero Gsonignorar nullcampos (digamos, se lastnameé null, não deve ser serializado).

Mas no campo opaqueData, eu quero nulls 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 @JsonAdapternã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?

Pirjo:

Gsonnão se preocupa em adaptar seu tipo de dados interna JsonElement. Eu não sei se há qualquer ponto desde JsonElementtipo é 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 JsonElementnão se destina a ser adaptada mais.

Então, quando Gsonatinge qualquer JsonElementapenas 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 TypeAdapterpara se adaptar isso para `null``or valor real.

Acho que você gosta

Origin http://43.154.161.224:23101/article/api/json?id=207572&siteId=1
Recomendado
Clasificación