Java8 SpringBoot 2.1.9.RELEASE
--Politiques pour désérialiser dans Jackson mais pas utiliser les setters de base
Getter / Setter
n'est pas nécessaire lorsque la visibilité du champ défini dans l'objet est publique, et il est nécessaire lorsqu'il est protégé ou moins, mais cette fois, il s'agit d'une politique de ne pas le définir en public
―― Visez à être immuable autant que possibleEnvoyer JSON: {" id ":" 1 "," name ":" Name "}
/**
*Ecrire avec Getter
*/
public class Sample {
String id;
String name;
public String getId() {
return id;
}
public String getName() {
return name;
}
}
/**
*Écrire dans le constructeur
*/
public class Sample {
String id;
String name;
public Sample(String id, String name) {
this.id = id;
this.name = name;
}
}
Envoyer JSON: {" id ": 1," age ": 20}
/**
*Ecrire avec Getter
*/
public class Sample {
int id;
int age;
public int getId() {
return id;
}
public int getAge() {
return age;
}
}
/**
*Écrire dans le constructeur
*/
public class Sample {
int id;
int age;
public Sample(int id, int age) {
this.id = id;
this.age = age;
}
}
Au fait, si vous utilisez le type Integer, vous pouvez tolérer null (colère)
{"id": null, "age": 20}
public class Sample {
Integer id;
int age;
public Sample(Integer id, int age) {
this.id = id;
this.age = age;
}
}
Résultat: ʻIntSample {id = null, age = 20} `
__Getter n'a pas pu être implémenté __
Alors seulement comment écrire dans le constructeur
Envoyer JSON: {" isHoge ": true," isFuga ": true}
/**
*Écrire dans le constructeur
*/
public class BooleanSample {
boolean isHoge;
boolean isFuga;
public BooleanSample(boolean isHoge, boolean isFuga) {
this.isHoge = isHoge;
this.isFuga = isFuga;
}
}
Pour le type booléen, ce sera null
si la désérialisation n'est pas possible.
Je l'ai vérifié comme String, int et boolean, mais il semble que le constructeur soit requis lorsque le booléen est mélangé, donc je ne peux pas envisager d'écrire avec Getter
. Par conséquent, il semble que seul le constructeur puisse être défini.
Je l'ai essayé avec Getter
Envoyer JSON: {" name ":" Kiguri "," age ": 24," isPerson ": true}
/**
*Ecrire avec Getter
*/
public class Sample {
String name;
int age;
boolean isPerson;
public String getName() {
return name;
}
public int getAge() {
return age;
}
public boolean isPerson() {
return isPerson;
}
}
Résultat: Sample {name = 'Kiguri', age = 24, isPerson = false}
La valeur de boolean n'est pas liée, ce qui est un résultat très décevant ...
/**
*Écrire dans le constructeur
*/
public class Sample {
String name;
int age;
boolean isPerson;
public Sample(String name, int age, boolean isPerson) {
this.name = name;
this.age = age;
this.isPerson = isPerson;
}
}
Résultat: SIBSample {name = 'Kiguri', age = 24, isPerson = true}
Je souris.
Avez-vous remarqué que l'exemple de code a jusqu'à présent préparé deux définitions de champ en commun? S'il n'y a qu'une seule définition de champ et qu'elle est désérialisée par le constructeur, elle est différente de l'utilisation d'origine, mais si vous n'utilisez pas @ JsonCreator
et @ JsonProperty
, vous obtiendrez une exception.
Envoyer JSON: {" name ":" Kiguri "}
public class Sample {
String name;
public Sample(String name) {
this.name = name;
}
}
{
"timestamp": "2019-10-11T03:25:50.724+0000",
"status": 400,
"error": "Bad Request",
"message": "JSON parse error: Cannot construct instance of `sandbox.Sample` (although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator); nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `sandbox.Sample` (although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator)\n at [Source: (PushbackInputStream); line: 1, column: 2]",
"path": "/s"
}
Envoyer JSON: {" name ":" Kiguri "}
public class Sample {
String name;
@JsonCreator
public Sample(@JsonProperty("name") String name) {
this.name = name;
}
}
C'était une explication complète de Jackson, ne pouvait-il pas s'agir d'une arnaque au titre?
Aussi, dites-moi qui est familier avec la partie piège.
On pourrait vous demander: "N'est-il pas correct d'ajouter @ JsonProperty
au champ sans utiliser de constructeur?", Mais je vais limiter la méthode d'instanciation à un et l'ajouter à l'argument constructeur pour faciliter la visualisation. Je vais. À la recherche d'un meilleur moyen !! !!
Recommended Posts