JavaRush /Blog Java /Random-MS /Pengalaman pertama saya dengan Jackson.
Иван
Tahap
Москва

Pengalaman pertama saya dengan Jackson.

Diterbitkan dalam kumpulan
Hai semua! Pada suatu masa dahulu, di galaksi yang jauh, jauh, JSON yang sangat panjang ditemui... Dan saya menjadi terlalu malas untuk mencipta POJO untuknya. Dan saya bertanya kepada diri sendiri: Bayangkan situasi di mana saya menerima respons dalam bentuk JSON dengan, sebagai contoh, kadar pertukaran. Terdapat banyak medan dalam JSON itu sendiri, dan saya memerlukan 2 daripadanya. Dan sekarang saya ingin tahu - bolehkah saya mencipta kelas dengan medan yang saya perlukan dan cuba menghuraikan json ini ke dalam objek kelas? Adakah Jackson akan faham apa yang saya mahu daripadanya? Dan, sewajarnya, jika dia faham dan boleh melakukannya dengan cara ini, bagaimana dia boleh melakukannya dengan lebih betul dan apa yang akan berfungsi dengan lebih cepat? Jadi, mengenai soalan yang saya ada tentang JSON dan persepsi Jackson tentangnya: Jackson akan memahami segala-galanya. Dia bijak. Dia hanya memerlukan sedikit bantuan dalam hal ini. Kami mencipta POJO - kelas Java biasa, yang akan menerangkan pembolehubah yang kami perlukan daripada JSON. Saya akan mengatakan dengan segera bahawa untuk ini adalah sangat wajar untuk mengkaji JSON itu sendiri, yang mana kami menulis kelas (kemungkinan besar ia akan mempunyai kelas bersarang yang juga perlu dibuat). Seterusnya, menggunakan anotasi @JsonCreator di atas pembina, kami menunjukkan bahawa medan kelas ini perlu diisi daripada JSON. Dalam parameter pembina, kita boleh menentukan medan Json yang hendak diberikan kepada medan kelas menggunakan anotasi @JsonParam("JsonFieldName"). Jika terdapat lebih banyak medan dalam json daripada yang kita perlukan (dan ini pada asalnya adalah soalan saya), kita mesti memberi amaran tentang perkara ini dan menjelaskan bahawa kita tidak memerlukan medan yang tinggal. Untuk ini kami menggunakan anotasi @JsonIgnoreProperties(ignoreUnknown=true). Kemudian, apabila menemui medan yang tidak diketahui, program tidak akan ranap. Dan, drum roll...! Kami mempunyai objek kelas dengan medan diisi (ya, betul-betul yang kami perlukan) dan kami boleh menggunakannya. Pada mulanya, saya menulis kelas saya sendiri yang berasingan dengan kaedah statik yang mengeluarkan nilai yang saya perlukan dan, jika perlu, membawanya ke dalam bentuk ilahi. Ia adalah satu tugas. Ia adalah artisanal. Ini adalah tongkat. Berikut ialah kelas itu sendiri dengan kaedah:
public class Methods {
    public static double findRes(String body, String need){
        int begin = body.indexOf(need);
        int end = body.indexOf(",", begin);
        String res = body.substring(begin, end);
        String res2 = res.substring(res.indexOf(":")+2);
        double finalRes = Double.parseDouble(res2);
        return finalRes;
    }

    public static String findUrl(String body, String need){
        int begin = body.indexOf(need) + need.length();
        int end = body.indexOf(",", begin);
        String res = body.substring(begin, end);
        String res2 = res.substring(res.indexOf(":")+1);
        return res2;
    }
}
Menggunakan Jackson adalah lebih mudah dan boleh dibaca (sekurang-kurangnya ia benar-benar lebih cantik). Dalam perbualan dengan abang kami, mereka mengesahkan: menggunakan perpustakaan, dalam kes kami, Jackson, adalah lebih baik.
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import org.springframework.stereotype.Component;

@Component
@JsonIgnoreProperties(ignoreUnknown = true)
public class CurrencyPojo {
    private Rates rates;

    public CurrencyPojo() {
    }

    @JsonCreator
    public CurrencyPojo(@JsonProperty("rates") Rates rates) {
        this.rates = rates;
    }

    public Rates getRates() {
        return rates;
    }

    public void setRates(Rates rates) {
        this.rates = rates;
    }

    @Override
    public String toString() {
        return "CurrencyPojo{" +
                "rates=" + rates +
                '}';
    }

    @Component
    @JsonIgnoreProperties(ignoreUnknown = true)
    public static class Rates {

        private double rub;
        private double inr;
        private double eur;

        public Rates() {
        }

        @JsonCreator
        public Rates(@JsonProperty("RUB") double rub,
                     @JsonProperty("INR") double inr,
                     @JsonProperty("EUR") double eur) {
            this.rub = rub;
            this.inr = inr;
            this.eur = eur;
        }

        public double getRub() {
            return rub;
        }

        public void setRub(double rub) {
            this.rub = rub;
        }

        public double getInr() {
            return inr;
        }

        public void setInr(double inr) {
            this.inr = inr;
        }

        public double getEur() {
            return eur;
        }

        public void setEur(double eur) {
            this.eur = eur;
        }

        @Override
        public String toString() {
            return "Rates{" +
                    "rub=" + rub +
                    ", inr=" + inr +
                    ", eur=" + eur +
                    '}';
        }
    }
}
Saya ingin menarik perhatian anda kepada penggunaan kelas bersarang. Sebelum tugasan ini, saya tidak dapat memikirkan kegunaan untuk mereka =) Dan berikut ialah contoh JSON yang masuk: Saya tidak tahu cara membuat "spoiler", jadi mari kita latih jari kita))
{
    "disclaimer": "Usage subject to terms: https://openexchangerates.org/terms",
    "license": "https://openexchangerates.org/license",
    "timestamp": 1638143999,
    "base": "USD",
    "rates": {
        "AED": 3.672934,
        "AFN": 95.889778,
        "ALL": 107.277494,
        "AMD": 483.27152,
        "ANG": 1.802446,
        "AOA": 585,
        "ARS": 100.99011,
        "AUD": 1.400119,
        "AWG": 1.80025,
        "AZN": 1.700805,
        "BAM": 1.734322,
        "BBD": 2,
        "BDT": 85.804468,
        "BGN": 1.727247,
        "BHD": 0.377164,
        "BIF": 1994.344572,
        "BMD": 1,
        "BND": 1.370223,
        "BOB": 6.905713,
        "BRL": 5.593606,
        "BSD": 1,
        "BTC": 0.000017488138,
        "BTN": 74.895631,
        "BWP": 11.828585,
        "BYN": 2.560653,
        "BZD": 2.015918,
        "CAD": 1.27258,
        "CDF": 2003.492833,
        "CHF": 0.92439,
        "CLF": 0.030154,
        "CLP": 831.315923,
        "CNH": 6.395085,
        "CNY": 6.393,
        "COP": 3975.845415,
        "CRC": 639.731775,
        "CUC": 1,
        "CUP": 25.75,
        "CVE": 97.95,
        "CZK": 22.7447,
        "DJF": 178.031664,
        "DKK": 6.585348,
        "DOP": 56.599119,
        "DZD": 139.135508,
        "EGP": 15.756894,
        "ERN": 15.000155,
        "ETB": 47.819833,
        "EUR": 0.885541,
        "FJD": 2.12473,
        "FKP": 0.749595,
        "GBP": 0.749595,
        "GEL": 3.095,
        "GGP": 0.749595,
        "GHS": 6.142755,
        "GIP": 0.749595,
        "GMD": 52.425,
        "GNF": 9472.013443,
        "GTQ": 7.738789,
        "GYD": 209.235741,
        "HKD": 7.7981,
        "HNL": 24.17051,
        "HRK": 6.661782,
        "HTG": 98.81349,
        "HUF": 327.09539,
        "IDR": 14379.716018,
        "ILS": 3.185445,
        "IMP": 0.749595,
        "INR": 75.050444,
        "IQD": 1458.680982,
        "IRR": 42275,
        "ISK": 130.231848,
        "JEP": 0.749595,
        "JMD": 155.740793,
        "JOD": 0.709,
        "JPY": 113.7185,
        "KES": 112.535405,
        "KGS": 84.774702,
        "KHR": 4069.37439,
        "KMF": 436.000041,
        "KPW": 900,
        "KRW": 1195.716418,
        "KWD": 0.30268,
        "KYD": 0.833396,
        "KZT": 436.292325,
        "LAK": 10839.499888,
        "LBP": 1520.868483,
        "LKR": 202.516227,
        "LRD": 142.25,
        "LSL": 16.236278,
        "LYD": 4.615464,
        "MAD": 9.244198,
        "MDL": 17.763696,
        "MGA": 3988.128848,
        "MKD": 54.637275,
        "MMK": 1790.896161,
        "MNT": 2854.559306,
        "MOP": 8.033255,
        "MRO": 356.999828,
        "MRU": 36.094075,
        "MUR": 43.067396,
        "MVR": 15.45,
        "MWK": 816.475065,
        "MXN": 21.738389,
        "MYR": 4.239,
        "MZN": 63.857001,
        "NAD": 16.26,
        "NGN": 410.875846,
        "NIO": 35.230131,
        "NOK": 9.0605,
        "NPR": 119.833306,
        "NZD": 1.465193,
        "OMR": 0.385109,
        "PAB": 1,
        "PEN": 4.033921,
        "PGK": 3.51889,
        "PHP": 50.480705,
        "PKR": 176.598456,
        "PLN": 4.168379,
        "PYG": 6826.299832,
        "QAR": 3.646364,
        "RON": 4.37388,
        "RSD": 103.877366,
        "RUB": 75.58127,
        "RWF": 1024.40338,
        "SAR": 3.7514,
        "SBD": 8.064563,
        "SCR": 14.654883,
        "SDG": 438,
        "SEK": 9.148279,
        "SGD": 1.370086,
        "SHP": 0.749595,
        "SLL": 11119.30017,
        "SOS": 580.721202,
        "SRD": 21.52,
        "SSP": 130.26,
        "STD": 21187.940504,
        "STN": 22.195,
        "SVC": 8.750748,
        "SYP": 2512.5,
        "SZL": 15.967534,
        "THB": 33.757117,
        "TJS": 11.286041,
        "TMT": 3.51,
        "TND": 2.882,
        "TOP": 2.277258,
        "TRY": 12.378954,
        "TTD": 6.78112,
        "TWD": 27.866934,
        "TZS": 2302.544214,
        "UAH": 27.094403,
        "UGX": 3563.214629,
        "USD": 1,
        "UYU": 44.148288,
        "UZS": 10783.399861,
        "VES": 4.57705,
        "VND": 22678.30849,
        "VUV": 111.998805,
        "WST": 2.563531,
        "XAF": 580.876668,
        "XAG": 0.04289544,
        "XAU": 0.00055691,
        "XCD": 2.70255,
        "XDR": 0.714635,
        "XOF": 580.876668,
        "XPD": 0.00055962,
        "XPF": 105.673123,
        "XPT": 0.00101782,
        "YER": 250.249937,
        "ZAR": 16.1344,
        "ZMW": 17.776133,
        "ZWL": 322
    }
}
Untuk menukar json menjadi objek kelas kami menggunakan pemeta:
ObjectMapper mapper = new ObjectMapper();
currencyPojo(an object нашего класса) = mapper.readValue(jsonResponse(Джсон в стринге), CurrencyPojo.class(класс, который нам нужен));
Kod itu berfungsi, ia menarik keluar dari hulk ini dengan tepat apa yang saya perlukan. Berikut ialah output objek kelas selepas menghuraikan: CurrencyPojo{rates=Rates{rub=73.6944, inr=75.621547, eur=0.885436}} Saya gembira. Hari kedua saya menepuk muka saya dan tersenyum dengan tangan saya... Atau sesuatu seperti itu. Nilai kadar mungkin berbeza kerana Teks JSON dan cetakan objek dari tarikh yang berbeza, tetapi secara umum hasilnya harus jelas. PS Saya menulis artikel buat kali pertama, jadi jangan menilai dengan tegas. Dan saya hanya seorang penggodam pemula =) Saya suka dan menerima kritikan;) PS2 Saya memohon maaf atas "banyak surat", tetapi saya cuba membentangkan apa yang saya kerjakan selama beberapa hari.
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION