JavaRush /Java Blog /Random-TK /Jekson çarçuwasy bilen tanyşlyk
Mikhail Fufaev
Dereje
Москва

Jekson çarçuwasy bilen tanyşlyk

Toparda çap edildi
Sowuk bahar gijesinde, ahyrsoňy 33-nji derejä ýetdim. Programmistiň ellerini süpürip, JSON seriallaşdyryş we deserializasiýa ugruny eýýäm kabul etmäge taýynlanýardym, ýöne gynansagam hiç zada düşünmedim. Leksiýanyň teksti ýadyma düşmedi, ýöne meseleler birneme içgin çözüldi. Şunuň bilen baglylykda, Jekson Çarçuwasynyň ýabany ýerlerine göz aýlamagy we bu JSON-yň nämedigini anyklamagy makul bildim.
Jekson çarçuwasy
Knowledgehli bilimlerimi aldaw görnüşinde (özüm üçinem, okyjylar üçinem) amaly we gysga görnüşde hödürlemäge synanyşaryn. Jekson Annotasiýalaryna syýahat. JSON-a barýan ýolda ilkinji duşýan zadymyz @JsonAutoDetect düşündirişidir. Bir seretseň, bu aňsat gysgaça mazmun, ýöne awtor muny anyklamak üçin iň köp wagt aldy. Tezisiň bize zerur 5 usuly bar:
  • fieldVisibility () - Diňe görkezilen giriş üýtgediji bilen meýdanlary seriýalaşdyrýar
  • getterVisibility () / setterVisibility () - getter / setteriň kesgitlenen giriş üýtgedijisi bolan meýdanlary seriýalaşdyrýar
  • isGetterVisibility () - bulean alýanlar üçin aýratyn ýerine ýetiriş
Usullaryň biri-birine bagly däldigine düşünmek möhümdir. Bular. meýdan düşündirişde görkezilen parametrleriň iň bolmanda birine gabat gelýän bolsa, JSON-a goşular. Parametrsiz konstruktor ulanyp mysal döredsek, bu koduň näme çykjakdygyna jogap bermäge synanyşyň:
@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;
    }
}
IsGetterVisibility aýyrsak näme etmeli? Sanawda görkezilen dört usul seriallaşdyrma prosesini düzdi. Bäşinji, öz gezeginde deserializasiýa prosesini düzgünleşdirýär:
  • döredijiVisibility () düşünmek üçin iň kyn usul. Konstruktorlar we zawod usullary (çagyrylanda obýekt döredýän usullar) bilen işleýär. Bir mysala seredeliň:
@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);
}
Deserializasiýa mehanizmi barada möhüm bellik! JSON-dan bir obýekt döretmäge synanyşanymyzda, zerur synpyň konstruktory JSON obýektindäki ýaly parametrler toplumy bilen gözlener. Aboveokardaky mysalda JSON obýektimiz iki parametrden durýar: ady, id. Haýsy konstruktoryň jaň etjekdigini çaklaň. Hawa, bu kody düzsek, ýalňyşlyk goýberer, näme üçin? Konstruktoryň görnükliligini çäklendirenimiz üçin (diňe goralýan, köpçülikleýin üýtgediji bolan konstruktorlar görünýär). CreatorVisibility-i aýyrsaňyz, işlär. Sorag ýüze çykýar. Konstruktordaky @JsonProperty näme? Bu barada makalanyň indiki bölüminde gürleşerin öýdýärin. PS Jenaplar, makala hakda iň bolmanda biraz jogap almak isleýärin. Bu mowzuga isleg barmy ýa-da dowam etdirmegiň ähmiýeti barmy, sebäbi mowzuklar kän we hemmesi gaty gyzykly. Şeýle hem, @JsonView, @JsonManagedReference, @JsonBackReference, @JsonUnwrapped we ş.m. ýaly bellikleri göz öňünde tutmak isleýärin. Sagbol :)
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION