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.
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
@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 :)
GO TO FULL VERSION