Este bean 'State':
public class State {
private boolean isSet;
@JsonProperty("isSet")
public boolean isSet() {
return isSet;
}
@JsonProperty("isSet")
public void setSet(boolean isSet) {
this.isSet = isSet;
}
}
é enviado pela conexão usando o retorno de chamada do ajax 'success':
success : function(response) {
if(response.State.isSet){
alert('success called successfully)
}
A anotação @JsonProperty é necessária aqui? Qual é a vantagem de usá-lo? Eu acho que posso remover esta anotação sem causar efeitos colaterais.
Lendo sobre esta anotação em https://github.com/FasterXML/jackson-annotations/wiki/Jackson-Annotations Não sei quando isso é necessário para ser usado?
Respostas:
Aqui está um bom exemplo. Eu o uso para renomear a variável porque o JSON é proveniente de um
.Net
ambiente em que as propriedades começam com uma letra maiúscula.Isso analisa corretamente de / para o JSON:
fonte
@JsonProperty
anotação.Double
? Eu só estou querendo saber se o tipo tem que serString
ou qualquer tipo que JSON suporte? Poderia ser qualquer tipo @OldCurmudgeon?Acho que OldCurmudgeon e StaxMan estão ambos corretos, mas aqui está uma resposta de sentença com um exemplo simples para você.
@JsonProperty (nome), informa ao Jackson ObjectMapper para mapear o nome da propriedade JSON para o nome do campo Java anotado.
fonte
bem para o que vale agora ... JsonProperty também é usado para especificar métodos getter e setter para a variável, além da serialização e desserialização usuais. Por exemplo, suponha que você tenha uma carga útil como esta:
e uma classe Deserializer:
Nesse caso, a anotação JsonProperty é necessária. No entanto, se você também tiver um método na classe
Consulte também esta documentação: http://fasterxml.github.io/jackson-annotations/javadoc/2.3.0/com/fasterxml/jackson/annotation/JsonProperty.html
fonte
Sem anotações, o nome da propriedade inferida (para corresponder ao JSON) seria "definido" e não - como parece ser a intenção - "isSet". Isso ocorre porque, de acordo com a especificação do Java Beans, métodos dos formatos "isXxx" e "setXxx" são usados para significar que há propriedade lógica "xxx" para gerenciar.
fonte
Como você sabe, trata-se de serializar e dessalinizar um objeto. Suponha que exista um objeto:
A serialização deste objeto é:
O nome da variável é usado diretamente para serializar dados. Se você estiver prestes a remover a API do sistema da implementação do sistema, em alguns casos, precisará renomear a variável em serialização / desserialização. @JsonProperty é um metadado para informar ao serializador como objeto serial. É usado para:
do exemplo:
fonte
Adicionar o JsonProperty também garante segurança, caso alguém decida alterar um dos nomes de propriedades que não percebem que a classe em questão será serializada em um objeto Json. Se eles mudarem o nome da propriedade, o JsonProperty garantirá que será usado no objeto Json, e não o nome da propriedade.
fonte
Além de outras respostas, a
@JsonProperty
anotação é realmente importante se você usar a@JsonCreator
anotação em classes que não possuem um construtor no-arg.Neste exemplo, o único construtor é marcado como
@JsonCreator
, portanto, Jackson usará esse construtor para criar a instância. Mas a saída é como:Mas após a adição da
@JsonProperty
anotação no construtor:A desserialização foi bem-sucedida:
fonte
Além de todas as respostas acima, não esqueça a parte da documentação que diz
Se você tem um
non-static
método em sua classe que não é convencionalgetter or setter
, pode fazê-lo agir como umgetter and setter
usando a anotação nele. Veja o exemplo abaixoQuando o objeto acima é serializado, a resposta conterá
getUsername()
getId()
getIdAndUsername
*Como o método
getIdAndUsername
começaget
, é tratado como getter normal, portanto, por que você pode fazer anotações com@JsonIgnore
.Se você notou que o item
concatenateIdAndUsername
não é retornado e é porque o nome não começaget
e se você deseja que o resultado desse método seja incluído na resposta, você pode usá@JsonProperty("...")
-lo e ele será tratado como normal,getter/setter
conforme mencionado na documentação destacada acima .fonte
De JsonProperty javadoc,
fonte