JavaRush /Java Blog /Random-TL /Panimula sa Jackson Framework
Mikhail Fufaev
Antas
Москва

Panimula sa Jackson Framework

Nai-publish sa grupo
Sa isang malamig na gabi ng tagsibol, sa wakas ay naabot ko ang antas 33. Hinahaplos ang aking mga kamay ng programmer, naghahanda na akong yakapin ang buong larangan ng serialization at deserialization ng JSON, ngunit, sa kasamaang-palad, wala akong naintindihan. Hindi ko naalala ang teksto ng lektura, ngunit ang mga problema ay nalutas kahit papaano nang intuitive. Sa pagsasaalang-alang na ito, nagpasya akong suriin ang mga wild ng Jackson Framework at alamin kung ano ang JSON na ito.
Jackson Framework
Susubukan kong ipakita ang lahat ng aking kaalaman sa isang praktikal at maigsi na paraan sa isang format ng cheat sheet (parehong para sa aking sarili at para sa mga mambabasa). Paglalakbay sa Jackson Anotasyon. Ang unang bagay na nakatagpo namin sa daan patungo sa JSON ay ang @JsonAutoDetect annotation. Sa unang tingin, ito ay isang madaling buod, ngunit kinailangan ng may-akda ang pinakamahabang oras upang malaman ito. Ang abstract ay may 5 pamamaraan na kailangan namin:
  • fieldVisibility () - Nagse-serialize lamang ng mga field na may tinukoy na access modifier
  • getterVisibility()/setterVisibility() - nagse-serialize ng mga field na ang getter/setter ay may tinukoy na access modifier
  • isGetterVisibility() - hiwalay na pagpapatupad para sa boolean getter
Mahalagang maunawaan na ang mga pamamaraan ay gumagana nang disjunctive. Yung. kung tumugma ang field sa kahit isa sa mga parameter na tinukoy sa anotasyon, isasama ito sa JSON. Subukang sagutin kung ano ang ilalabas ng code na ito kung gagawa kami ng isang instance gamit ang isang parameterless constructor:
@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;
    }
}
Paano kung alisin namin ang isGetterVisibility? Ang apat na paraan na nakalista ay na-configure ang proseso ng serialization. Ang panglima, naman, ay kinokontrol ang proseso ng deserialization:
  • creatorVisibility() ay ang pinakamahirap na paraan upang maunawaan. Gumagana ito sa mga konstruktor at sa mga pamamaraan ng pabrika (mga pamamaraan na lumilikha ng isang bagay kapag tinawag). Tingnan natin ang isang halimbawa:
@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);
}
Mahalagang tala sa mekanismo ng deserialization! Kapag sinubukan naming gumawa ng object mula sa JSON, hahanapin ang constructor ng kinakailangang klase na may parehong set ng mga parameter tulad ng sa JSON object. Sa halimbawa sa itaas, ang aming JSON object ay binubuo ng dalawang parameter: name, id. Hulaan kung aling constructor ang tatawagin nito. At oo, kung isasama natin ang code na ito, ito ay magtapon ng isang error, bakit? Dahil nililimitahan namin ang visibility ng constructor (mga constructor lang na may protektado, pampublikong modifier ang makikita). Kung aalisin mo ang creatorVisibility gagana ito. Ang tanong ay lumitaw. Ano ang @JsonProperty sa constructor? Sa palagay ko ay pag-uusapan ko ito sa susunod na bahagi ng artikulo. PS Mga ginoo, gusto ko talagang makakuha ng kahit kaunting tugon tungkol sa artikulo. Nagtataka ako kung ang paksang ito ay hinihiling at kung ito ay nagkakahalaga ng pagpapatuloy, dahil maraming mga paksa at lahat sila ay lubhang kawili-wili. Gusto ko ring isaalang-alang ang mga anotasyon gaya ng @JsonView, @JsonManagedReference, @JsonBackReference, @JsonUnwrapped, atbp. Salamat :)
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION