JavaRush /وبلاگ جاوا /Random-FA /مقدمه ای بر چارچوب جکسون
Mikhail Fufaev
مرحله
Москва

مقدمه ای بر چارچوب جکسون

در گروه منتشر شد
در یک شب سرد بهاری بالاخره به سطح 33 رسیدم. با مالیدن دست های برنامه نویسم، از قبل آماده می شدم تا کل زمینه سریال سازی و سریال سازی JSON را در آغوش بگیرم، اما، متأسفانه، چیزی متوجه نشدم. متن سخنرانی را به خاطر نداشتم، اما مشکلات به نوعی به طور مستقیم حل شد. در این راستا، من تصمیم گرفتم که در جکسون فریم ورک جستجو کنم و بفهمم که این JSON چیست.
چارچوب جکسون
من سعی خواهم کرد تمام دانش خود را به صورت عملی و مختصر در قالب یک برگه تقلب (هم برای خودم و هم برای خوانندگان) ارائه دهم. سفر به جکسون حاشیه نویسی. اولین چیزی که در راه JSON با آن روبرو می شویم حاشیه نویسی @JsonAutoDetect است. در نگاه اول، این یک خلاصه آسان است، اما نویسنده طولانی ترین زمان را صرف فهمیدن آن کرده است. چکیده دارای 5 روش است که ما نیاز داریم:
  • fieldVisibility () - فقط فیلدها را با اصلاح کننده دسترسی مشخص شده سریال می کند
  • getterVisibility()/setterVisibility() - فیلدهایی را که getter/setter دارای اصلاح کننده دسترسی مشخص شده است را سریال می کند.
  • isGetterVisibility() - پیاده سازی جداگانه برای گیرنده های بولی
درک این نکته مهم است که روش‌ها به صورت مجزا کار می‌کنند. آن ها اگر فیلد حداقل با یکی از پارامترهای مشخص شده در حاشیه نویسی مطابقت داشته باشد، در JSON گنجانده می شود. سعی کنید پاسخ دهید اگر یک نمونه با استفاده از سازنده بدون پارامتر ایجاد کنیم، این کد چه خروجی خواهد داشت:
@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 را حذف کنیم چه؟ چهار روش ذکر شده روند سریال سازی را پیکربندی کردند. پنجم، به نوبه خود، فرآیند deserialization را تنظیم می کند:
  • creatorVisibility () سخت ترین روش برای درک است. با سازنده ها و با متدهای کارخانه (روش هایی که هنگام فراخوانی یک شی ایجاد می کنند) کار می کند. بیایید به یک مثال نگاه کنیم:
@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);
}
نکته مهم در مورد مکانیسم deserialization! وقتی می‌خواهیم یک شی از JSON ایجاد کنیم، سازنده کلاس مورد نیاز با همان مجموعه پارامترهایی که در شی JSON وجود دارد جستجو می‌شود. در مثال بالا، شی JSON ما از دو پارامتر تشکیل شده است: name، id. حدس بزنید با کدام سازنده تماس می گیرد. و بله، اگر این کد را کامپایل کنیم، خطا می دهد، چرا؟ زیرا ما دید سازنده را محدود کردیم (فقط سازنده هایی با اصلاح کننده محافظت شده عمومی قابل مشاهده هستند). اگر creatorVisibility را حذف کنید کار خواهد کرد. سوال پیش می آید. @JsonProperty در سازنده چیست؟ فکر می کنم در قسمت بعدی مقاله در مورد این موضوع صحبت خواهم کرد. PS آقایان، من واقعاً دوست دارم حداقل در مورد مقاله پاسخی دریافت کنم. من نمی دانم که آیا این موضوع مورد تقاضا است و آیا ارزش ادامه دادن را دارد، زیرا موضوعات زیادی وجود دارد و همه آنها بسیار جالب هستند. همچنین می‌خواهم حاشیه‌نویسی‌هایی مانند @JsonView، @JsonManagedReference، @JsonBackReference، @JsonUnwrapped و غیره را در نظر بگیرم. متشکرم :)
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION