Κοινή χρήση τεχνολογίας

Σχολιασμοί SpringBoot--11--@JSONField @JsonProperty

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Συμβουλή: Μετά τη σύνταξη του άρθρου, ο πίνακας περιεχομένων μπορεί να δημιουργηθεί αυτόματα Για τον τρόπο δημιουργίας του, ανατρέξτε στο έγγραφο βοήθειας στα δεξιά.


Ερώτηση: Τα χαρακτηριστικά που ξεκινούν με isXXX στην κλάση οντοτήτων back-end καταργούνται αυτόματα αφού περάσουν στο front-end.

Εισαγάγετε την περιγραφή της εικόνας εδώ

Εισαγάγετε την περιγραφή της εικόνας εδώ
Εισαγάγετε την περιγραφή της εικόνας εδώ
Εισαγάγετε την περιγραφή της εικόνας εδώ
Εισαγάγετε την περιγραφή της εικόνας εδώ

Λύση:

  1. Αλλάξτε το όνομα της μεθόδου isReceipt() που δημιουργήθηκε σε getIsReceipt()
  2. Προσθέστε τον σχολιασμό @JsonProperty(value = “isXXX”) στη μέθοδο λήψης που δημιουργήθηκε, δηλαδή isReceipt.
 @JsonProperty(value = "isReceipt")
    public boolean isReceipt() {
        return isReceipt;
    }
    @JsonProperty(value = "isExamine")
    public boolean isExamine() {
        return isExamine;
    }

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

Εισαγάγετε την περιγραφή της εικόνας εδώ

@JsonProperty και @JSONField

1. Εισαγωγή

  • Οι σχολιασμοί @JsonProperty και @JSONField είναι γιαΚατά τη μετατροπή του obj σε συμβολοσειρά json, αντικαταστήστε το όνομα του χαρακτηριστικού του java bean με το όνομα του χαρακτηριστικού στόχου . Είναι σύνηθες σε σενάρια όπου τα ονόματα ιδιοτήτων είναι ασυνεπή κατά την κλήση διεπαφών τρίτων.
  • Οι λειτουργίες των δύο σχολιασμών είναι ίδιες, αλλά προέρχονται από διαφορετικές πηγές και χρησιμοποιούνται με διαφορετικούς τρόπους. Οι ομοιότητες και οι διαφορές θα εξηγηθούν αναλυτικά παρακάτω!

2. Η διαφορά μεταξύ των σχολιασμών

2.1 Το υποκείμενο πλαίσιο είναι διαφορετικό

  • Το @JsonProperty υλοποιείται από τον Jackson
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>版本号</version>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • Το @JSONField υλοποιείται από την fastjson
         <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>版本号</version>
        </dependency>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2.2 Διαφορετικά πεδία

Ο σχολιασμός @JSONproperty χρησιμοποιείται γιαΓνωρίσματαπάνω από

  • Για να σειριοποιήσετε το χαρακτηριστικό trueName στο όνομα, μπορείτε να προσθέσετε @JsonProperty(value="name") στο όνομα του χαρακτηριστικού.

Μπορεί να χρησιμοποιηθεί σχολιασμός @JSONFieldλήψη, ρύθμιση και ιδιότητεςπάνω από

  • Για να σειριοποιήσετε το χαρακτηριστικό trueName στο όνομα, μπορείτε να προσθέσετε το @JSONField(value="name") στο όνομα get/set/property.

2.3 Σύγκριση πλεονεκτημάτων και μειονεκτημάτων

  1. Ο σχολιασμός @JSONField είναι πιο απλός στη χρήση Η προεπιλεγμένη τιμή του σχολιασμού είναι η ίδια με το όνομα της ιδιότητας, ενώ το @JsonProperty απαιτεί τον μη αυτόματο καθορισμό του ονόματος της ιδιότητας.

  2. Ο σχολιασμός @JSONField υποστηρίζει περισσότερες επιλογές αντιστοίχισης χαρακτηριστικών, όπως η μορφή ημερομηνίας κατά τη σειριοποίηση, ο τρόπος χειρισμού των μηδενικών τιμών κ.λπ.

  3. Η απόδοση του σχολιασμού @JSONField είναι ταχύτερη επειδή το ίδιο το fastjson είναι μια βιβλιοθήκη επεξεργασίας JSON υψηλής απόδοσης

  4. Όταν χρησιμοποιείτε το πλαίσιο Jackson, μπορείτε να χρησιμοποιήσετε μόνο τον σχολιασμό @JsonProperty και δεν μπορείτε να χρησιμοποιήσετε τον σχολιασμό @JSONField.

@JsonProperty

Εάν χρησιμοποιείτε ένα νέοέργο Springboot, η προεπιλογή είναι η σειριοποίηση Jackson, απλώς χρησιμοποιήστε σχολιασμούς απευθείας στις ιδιότητες.

1. Εξάρτηση

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>版本号</version>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • Ο σχολιασμός @JsonProperty προέρχεται από το πακέτο jackson και χρησιμοποιείται με τη μέθοδο ObjectMapper().writeValueAsString (κλάση οντότητας) για τη μετατροπή της κλάσης οντότητας σε συμβολοσειρά json.
  • Χρησιμοποιείται με τη μέθοδο ObjectMapper().readValue(string) για τη μετατροπή συμβολοσειρών json σε κλάσεις οντοτήτων.

2. Δοκιμάστε τη μετατροπή μεταξύ συμβολοσειράς json και αντικειμένου bean

Κλάση οντότητας: User.java

import com.fasterxml.jackson.annotation.JsonProperty;
 
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
	@JsonProperty("JsonPropertyName")
	private String name;
	private String sex;
	private Integer age;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

Μέθοδοι δοκιμής:

@Test
public void testJsonProperty() throws IOException{
    //bean ---> json
	User user=new User("zhangsan","man",22);
	
	System.out.println(new ObjectMapper().writeValueAsString(user));
	

    //json ---> bean
	String str="{"sex":"man","age":22,"JsonPropertyName":"zhangsan"}";
	
	System.out.println(new ObjectMapper().readValue(str, User.class).toString());
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

Αποτελέσματα δοκιμής:

{"sex":"man","age":22,"JsonPropertyName":"zhangsan"}
User [name=zhangsan, sex=man, age=22]
  • 1
  • 2
  • Μπορεί να φανεί ότι μετά τη μετατροπή του bean σε μια συμβολοσειρά json, το όνομα της ιδιότητας bean που σχολιάζεται με @JsonProperty έχει αντικατασταθεί με το καθορισμένο όνομα ιδιότητας: JsonPropertyName;

  • Αφού η συμβολοσειρά json μετατραπεί σε bean, το όνομα ιδιότητας που καθορίζεται από τον σχολιασμό @JsonProperty έχει αντικατασταθεί από το όνομα ιδιότητας bean: name;

@JSONField

1. Εξάρτηση

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>版本号</version>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • Το @JSONField βρίσκεται στο πακέτο fastjson και χρησιμοποιείται με τη μέθοδο JSON.toJSONString (κλάση οντοτήτων) για τη μετατροπή κλάσεων οντοτήτων σε συμβολοσειρές json.
  • Χρησιμοποιήστε το με τη μέθοδο JSON.parseObject(string, entity class.class) για να μετατρέψετε τις συμβολοσειρές json σε κλάσεις οντοτήτων.

2. Δοκιμάστε τη μετατροπή μεταξύ συμβολοσειράς json και αντικειμένου bean

Κλάση οντότητας: User.java

import com.alibaba.fastjson.annotation.JSONField;
 
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
	@JSONField(name="JSONFieldName")
	private String name;
	private String sex;
	private Integer age;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

Μέθοδοι δοκιμής:

@Test
public void testSONField(){
    //bean ---> json
	User user=new User("zhangsan","man",22);
	System.out.println(JSON.toJSONString(user));
	
    //json ---> bean
	String str="{"JSONFieldName":"zhangsan","age":22,"sex":"man"}";
	System.out.println(JSON.parseObject(str, User.class).toString());	
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

Αποτελέσματα δοκιμής:

{"JSONFieldName":"zhangsan","age":22,"sex":"man"}
User [name=zhangsan, sex=man, age=22]
  • 1
  • 2
  1. Μπορεί να φανεί ότι μετά τη μετατροπή του bean σε μια συμβολοσειρά json, το όνομα του χαρακτηριστικού bean του σχολιασμού @JSONField έχει αντικατασταθεί με το καθορισμένο όνομα χαρακτηριστικού: JSONFieldName;
  2. Αφού η συμβολοσειρά json μετατραπεί σε bean, το όνομα χαρακτηριστικού που καθορίζεται από τον σχολιασμό @JSONField έχει αντικατασταθεί από το όνομα του χαρακτηριστικού bean: name;
  3. Τα αποτελέσματα της δοκιμής είναι ίδια με το @JsonProperty.

3.χαρακτηριστικό format

Το χαρακτηριστικό format μπορεί να χρησιμοποιηθεί για τον καθορισμό της μορφής των χαρακτηριστικών τύπου ημερομηνίας και της μορφής μετατροπής αριθμητικών τύπων σε τύπους συμβολοσειρών.

public class User {
    private String name;
    private int age;
    @JSONField(format = "yyyy-MM-dd")
    private Date birthday;
    @JSONField(format = "#,###.00")
    private double salary;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • Στο παραπάνω παράδειγμα, ο σχολιασμός @JSONField χρησιμοποιείται για τον καθορισμό της μορφής ημερομηνίας του χαρακτηριστικού γενεθλίων ως "εεεε-ΜΜ-ηη"
  • Η μορφή αριθμού του χαρακτηριστικού μισθού είναι "#,###.00"

4. σειριακή ιδιότητα

  • Μπορείτε να ελέγξετε εάν τα χαρακτηριστικά θα είναι σειριακά σε αντικείμενα JSON μέσω του χαρακτηριστικού serialize.
  • Όταν το χαρακτηριστικό serialize είναι false, οι ιδιότητες δεν θα σειριοποιηθούν στο αντικείμενο JSON Η προεπιλογή είναι true.
public class User {
    @JSONField(serialize = false)
    private int userId;
    private String name;
    private int age;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

Στο παραπάνω παράδειγμα, το χαρακτηριστικό userId εξαιρείται από τη σειριοποίηση χρησιμοποιώντας τον σχολιασμό @JSONField

5.deserialize χαρακτηριστικό

  • Το χαρακτηριστικό deserialize μπορεί να χρησιμοποιηθεί για να ελεγχθεί εάν οι ιδιότητες στο αντικείμενο JSON είναι deserialize στο αντικείμενο Java.
  • Όταν το χαρακτηριστικό deserialize είναι false, αυτό το χαρακτηριστικό δεν θα μεταφερθεί από το αντικείμενο JSON στο αντικείμενο Java Η προεπιλογή είναι true.
public class User {
    private int userId;
    private String name;
    @JSONField(deserialize = false)
    private int age;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

Στο παραπάνω παράδειγμα, η ιδιότητα age εξαιρείται από την αφαίρεση με χρήση του σχολιασμού @JSONField

6.τακτική ιδιότητα

Η σειρά των χαρακτηριστικών μπορεί να καθοριστεί μέσω του τακτικού χαρακτηριστικού

  • Από προεπιλογή, η σειρά των ιδιοτήτων βασίζεται στη σειρά με την οποία εμφανίζονται οι ιδιότητες στο αντικείμενο Java.
public class User {
    @JSONField(ordinal = 2)
    private String name;
    @JSONField(ordinal = 1)
    private int age;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

Στο παραπάνω παράδειγμα, ο σχολιασμός @JSONField χρησιμοποιείται για να ορίσει ότι η σειρά του χαρακτηριστικού ηλικία είναι 1 και η σειρά του χαρακτηριστικού name είναι 2.

7.defaultValue χαρακτηριστικό

Το χαρακτηριστικό defaultValue μπορεί να χρησιμοποιηθεί για τον καθορισμό της προεπιλεγμένης τιμής του χαρακτηριστικού στο αντικείμενο Java.

public class User {
    @JSONField(defaultValue = "0")
    private int userId;
    @JSONField(defaultValue = "N/A")
    private String name;
    private int age;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

Στο παραπάνω παράδειγμα, ο σχολιασμός @JSONField χρησιμοποιείται για να καθορίσει ότι η προεπιλεγμένη τιμή του χαρακτηριστικού userId είναι 0 και η προεπιλεγμένη τιμή του χαρακτηριστικού name είναι "N/A"

8. ιδιότητα τύπου

  • Ο τύπος του χαρακτηριστικού μπορεί να καθοριστεί μέσω του χαρακτηριστικού τύπου
public class User {
    private int userId;
    @JSONField(type = FieldType.STRING)
    private int age;
}
  • 1
  • 2
  • 3
  • 4
  • 5

Στο παραπάνω παράδειγμα, ο σχολιασμός @JSONField χρησιμοποιείται για να καθορίσει τον τύπο του χαρακτηριστικού ηλικία ως τύπο συμβολοσειράς.