JavaRush /Blogue Java /Random-PT /Introdução à Estrutura Jackson
Mikhail Fufaev
Nível 35
Москва

Introdução à Estrutura Jackson

Publicado no grupo Random-PT
Em uma noite fria de primavera, finalmente alcancei o nível 33. Esfregando as mãos de programador, já estava me preparando para abraçar todo o campo de serialização e desserialização JSON, mas, infelizmente, não entendi nada. Não me lembrava do texto da palestra, mas os problemas foram resolvidos de forma intuitiva. Nesse sentido, decidi me aprofundar no Jackson Framework e descobrir o que é esse JSON.
Estrutura Jackson
Tentarei apresentar todo o meu conhecimento de forma prática e concisa em formato de cábula (tanto para mim quanto para os leitores). Jornada para anotações de Jackson. A primeira coisa que encontramos no caminho para JSON é a anotação @JsonAutoDetect. À primeira vista, este é um resumo fácil, mas o autor levou muito tempo para entendê-lo. O resumo tem 5 métodos que precisamos:
  • fieldVisibility () - Serializa apenas campos com o modificador de acesso especificado
  • getterVisibility()/setterVisibility() - serializa campos cujo getter/setter possui o modificador de acesso especificado
  • isGetterVisibility() – implementação separada para getters booleanos
É importante compreender que os métodos funcionam de forma disjuntiva. Aqueles. se o campo corresponder a pelo menos um dos parâmetros especificados na anotação, ele será incluído no JSON. Tente responder o que este código produzirá se criarmos uma instância usando um construtor sem parâmetros:
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.PUBLIC_ONLY,
        getterVisibility        = JsonAutoDetect.Visibility.PUBLIC_ONLY,
        setterVisibility        = JsonAutoDetect.Visibility.PUBLIC_ONLY,
        isGetterVisibility      = JsonAutoDetect.Visibility.PROTECTED_AND_PUBLIC)
public class HeadClass {
    public String name;
    private Map<String, String> properties;
    public Queue<String> queue;
    protected List<String> list;
    private int age;
    private int number;
    private boolean isHead;

    protected HeadClass(int age) {
        this.age = age;
    }

    public HeadClass() {}

    Map<String, String> getProperties() {
        return properties;
    }

    protected boolean isHead() {
        return isHead;
    }

    protected void setProperties(Map<String, String> properties) {
        this.properties = properties;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getAge() {
        return age;
    }
}
E se removermos isGetterVisibility? Os quatro métodos listados configuraram o processo de serialização. O quinto, por sua vez, regulamenta o processo de desserialização:
  • creatorVisibility() é o método mais difícil de entender. Funciona com construtores e com métodos de fábrica (métodos que criam um objeto quando chamados). Vejamos um exemplo:
@JsonAutoDetect(creatorVisibility = JsonAutoDetect.Visibility.PROTECTED_AND_PUBLIC)
public class HeadClass {
    public String name;
    public int id;

    HeadClass(@JsonProperty(value = "name") String name, @JsonProperty(value = "id") int id) {
        this.name = name;
        this.id = id;
    }

    protected HeadClass(String name) {
        this.name = name;
        this.id = 123;
    }

    protected HeadClass(int id) {
        this.id = id;
        this.name = "Yes!";
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
public static void main(String[] args) throws Exception {
    ObjectMapper mapper = new ObjectMapper();
    String forDeserialize = "{\"name\":\"No!\",\"id\":123}";
    StringReader reader = new StringReader(forDeserialize);

    HeadClass headClass1 = (HeadClass) mapper.readValue(reader, HeadClass.class);
}
Nota importante sobre o mecanismo de desserialização! Quando tentamos criar um objeto a partir de JSON, o construtor da classe necessária será pesquisado com o mesmo conjunto de parâmetros do objeto JSON. No exemplo acima, nosso objeto JSON consiste em dois parâmetros: nome, id. Adivinhe qual construtor ele chamará. E sim, se compilarmos este código, ocorrerá um erro, por quê? Porque limitamos a visibilidade do construtor (apenas construtores com o modificador protegido e público são visíveis). Se você remover o creatorVisibility, ele funcionará. Surge a questão. O que é @JsonProperty no construtor? Acho que falarei sobre isso na próxima parte do artigo. PS Senhores, eu realmente gostaria de obter pelo menos alguma resposta sobre o artigo. Gostaria de saber se esse tema está em alta e se vale a pena continuar, porque são muitos temas e todos muito interessantes. Também gostaria de considerar anotações como @JsonView, @JsonManagedReference, @JsonBackReference, @JsonUnwrapped, etc. Obrigado :)
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION