Teknologian jakaminen

SpringBoot-merkinnät--11--@JSONField @JsonProperty

2024-07-12

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

Vihje: Kun artikkeli on kirjoitettu, sisällysluettelo voidaan luoda automaattisesti. Katso oikealla olevasta ohjeasiakirjasta, miten se luodaan.


Kysymys: Taustaentiteettiluokassa isXXX-alkuiset attribuutit poistetaan automaattisesti sen jälkeen, kun ne on siirretty käyttöliittymään.

Lisää kuvan kuvaus tähän

Lisää kuvan kuvaus tähän
Lisää kuvan kuvaus tähän
Lisää kuvan kuvaus tähän
Lisää kuvan kuvaus tähän

Ratkaisu:

  1. Muuta luodun isReceipt()-metodin nimi muotoon getIsReceipt()
  2. Lisää @JsonProperty(value = "isXXX") -merkintä luotuun get-metodiin, eli 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

Lisää kuvan kuvaus tähän

@JsonProperty ja @JSONField

1. Esittely

  • @JsonProperty- ja @JSONField-merkinnät on tarkoitettuKun muunnat obj:n json-merkkijonoksi, korvaa java beanin attribuutin nimi kohdeattribuutin nimellä . Se on yleistä skenaarioissa, joissa ominaisuuksien nimet ovat epäjohdonmukaisia ​​kutsuttaessa kolmannen osapuolen rajapintoja.
  • Kahden merkinnän toiminnot ovat samat, mutta ne tulevat eri lähteistä ja niitä käytetään eri tavoin. Yhtäläisyydet ja erot selitetään alla yksityiskohtaisesti!

2. Ero huomautusten välillä

2.1 Taustalla oleva kehys on erilainen

  • @JsonProperty on Jacksonin toteuttama
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>版本号</version>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • @JSONField on fastjsonin toteuttama
         <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>版本号</version>
        </dependency>

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

2.2 Erilaiset laajuudet

@JSON-ominaisuusmerkintää käytetäänAttribuutitedellä

  • Voit sarjoittaa trueName-attribuutin nimeksi lisäämällä @JsonProperty(value="name") attribuutin nimeen.

@JSONField-merkintää voidaan käyttäähanki, aseta ja ominaisuuksiaedellä

  • Voit sarjoittaa trueName-attribuutin nimeksi lisäämällä @JSONField(value="nimi") get/set/omaisuuden nimeen.

2.3 Etujen ja haittojen vertailu

  1. @JSONField-merkintä on yksinkertaisempi käyttää. Huomautuksen oletusarvo on sama kuin ominaisuuden nimi, kun taas @JsonProperty edellyttää ominaisuuden nimen määrittämistä manuaalisesti.

  2. @JSONField-merkintä tukee enemmän attribuuttien kartoitusvaihtoehtoja, kuten päivämäärämuotoa sarjoittaessa, nolla-arvojen käsittelyä jne.

  3. @JSONField-merkinnän suorituskyky on nopeampi, koska fastjson itsessään on korkean suorituskyvyn JSON-käsittelykirjasto

  4. Kun käytät Jackson-kehystä, voit käyttää vain @JsonProperty-merkintää etkä @JSONField-merkintää.

@JsonProperty

Jos käytät uuttaspringboot projekti, oletuksena on Jackson-serialisointi, käytä vain huomautuksia suoraan ominaisuuksissa.

1. Riippuvuus

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>版本号</version>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • @JsonProperty-merkintä tulee jackson-paketista, ja sitä käytetään ObjectMapper().writeValueAsString (entity class) -metodin kanssa entiteettiluokan muuntamiseen json-merkkijonoksi.
  • Käytetään ObjectMapper().readValue(string)-menetelmän kanssa json-merkkijonojen muuntamiseen entiteettiluokiksi.

2. Testaa muunnos json-merkkijonon ja bean-objektin välillä

Entiteettiluokka: 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

Testausmenetelmät:

@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

Testitulokset:

{"sex":"man","age":22,"JsonPropertyName":"zhangsan"}
User [name=zhangsan, sex=man, age=22]
  • 1
  • 2
  • Voidaan nähdä, että sen jälkeen, kun bean on muunnettu json-merkkijonoksi, @JsonProperty-merkinnällä varustettu papuominaisuuden nimi on korvattu määritetyllä ominaisuuden nimellä: JsonPropertyName;

  • Kun json-merkkijono on muunnettu papuksi, @JsonProperty-merkinnän määrittämä ominaisuuden nimi on korvattu papuominaisuuden nimellä: name;

@JSONField

1. Riippuvuus

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>版本号</version>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • @JSONField sijaitsee fastjson-paketissa ja sitä käytetään JSON.toJSONString-menetelmän (entity class) kanssa entiteettiluokkien muuntamiseen json-merkkijonoiksi.
  • Käytä sitä JSON.parseObject(string, entity class.class) -metodin kanssa json-merkkijonojen muuntamiseen entiteettiluokiksi.

2. Testaa muunnos json-merkkijonon ja bean-objektin välillä

Entiteettiluokka: 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

Testausmenetelmät:

@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

Testitulokset:

{"JSONFieldName":"zhangsan","age":22,"sex":"man"}
User [name=zhangsan, sex=man, age=22]
  • 1
  • 2
  1. Voidaan nähdä, että kun papu on muutettu json-merkkijonoksi, @JSONField-merkinnän papuattribuutin nimi on korvattu määritetyllä määritteen nimellä: JSONFieldName;
  2. Kun json-merkkijono on muunnettu papuksi, @JSONField-merkinnän määrittämä attribuutin nimi on korvattu papuattribuutin nimellä: name;
  3. Testitulokset ovat samat kuin @JsonProperty.

3.format-attribuutti

Format-attribuutilla voidaan määrittää päivämäärätyyppiattribuuttien muoto ja muoto, jolla numeeriset tyypit muunnetaan merkkijonotyypeiksi.

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
  • Yllä olevassa esimerkissä @JSONField-merkintää käytetään syntymäpäivämääritteen päivämäärämuodon määrittämiseen muodossa "vvvv-KK-pp".
  • Palkkamääritteen numeromuoto on "#,###.00"

4. serialize attribuutti

  • Voit hallita sarjoitetaanko attribuutit JSON-objekteiksi serialize-attribuutin avulla.
  • Kun serialize-attribuutti on epätosi, ominaisuuksia ei sarjoiteta JSON-objektiin. Oletusarvo on tosi.
public class User {
    @JSONField(serialize = false)
    private int userId;
    private String name;
    private int age;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

Yllä olevassa esimerkissä userId-attribuutti jätetään serialoinnin ulkopuolelle @JSONField-merkinnällä

5.deserialize attribuutti

  • Deserialize-attribuutilla voidaan hallita, sarjoistetaanko JSON-objektin ominaisuuksia Java-objekteiksi.
  • Kun deserialize-attribuutti on epätosi, tätä attribuuttia ei sarjoiteta JSON-objektista Java-objektiin.
public class User {
    private int userId;
    private String name;
    @JSONField(deserialize = false)
    private int age;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

Yllä olevassa esimerkissä ikä-ominaisuus suljetaan pois sarjoituksesta @JSONField-merkinnän avulla

6.järjestysmäärite

Attribuuttien järjestys voidaan määrittää ordinaal-attribuutilla

  • Oletusarvoisesti ominaisuuksien järjestys perustuu järjestykseen, jossa ominaisuudet näkyvät Java-objektissa.
public class User {
    @JSONField(ordinal = 2)
    private String name;
    @JSONField(ordinal = 1)
    private int age;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

Yllä olevassa esimerkissä @JSONField-merkintää käytetään määrittämään ikä-attribuutin järjestys 1 ja name-attribuutin järjestys 2.

7.defaultValue-attribuutti

defaultValue-attribuutilla voidaan määrittää attribuutin oletusarvo Java-objektissa.

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

Yllä olevassa esimerkissä @JSONField-merkintää käytetään määrittämään, että userId-attribuutin oletusarvo on 0 ja name-attribuutin oletusarvo on "N/A".

8. tyyppi attribuutti

  • Attribuutin tyyppi voidaan määrittää type-attribuutin kautta
public class User {
    private int userId;
    @JSONField(type = FieldType.STRING)
    private int age;
}
  • 1
  • 2
  • 3
  • 4
  • 5

Yllä olevassa esimerkissä @JSONField-merkintää käytetään määrittämään ikä-attribuutin tyyppi merkkijonotyypiksi.