Vodič za FastJson

1. Pregled

FastJson je lagana Java knjižnica koja se koristi za učinkovito pretvaranje JSON nizova u Java objekte i obrnuto.

U ovom ćemo članku zaroniti u nekoliko konkretnih i praktičnih primjena FastJson knjižnice.

2. Konfiguracija Maven

Da bismo započeli suradnju s FastJsonom, prvo to moramo dodati našem pom.xml:

 com.alibaba fastjson 1.2.13 

I kao kratka napomena - evo najnovije verzije knjižnice na Maven Central-u.

3. Pretvorite Java objekte u JSON format

Definirajmo sljedeće Osoba Java grah:

javni razred Osoba {@JSONField (name = "AGE") private int age; @JSONField (name = "FULL NAME") privatni niz puno ime; @JSONField (name = "DATUM ROĐENJA") private Date dateOfBirth; javna Osoba (int age, String fullName, Date dateOfBirth) {super (); this.age = dob; this.fullName = puno ime; this.dateOfBirth = dateOfBirth; } // standardni getteri i postavljači}

Možemo koristiti JSON.toJSONString () za pretvaranje Java objekta u JSON niz:

privatni popis listOfPersons = novi ArrayList (); @Before public void setUp () {listOfPersons.add (nova osoba (15, "John Doe", novi datum ())); listOfPersons.add (nova osoba (20, "Janette Doe", novi datum ())); } @Test public void whenJavaList_thanConvertToJsonCorrect () {String jsonOutput = JSON.toJSONString (listOfPersons); }

I evo rezultata:

[{"DOBA": 15, "DATUM ROĐENJA": 1468962431394, "PUNO IME": "John Doe"}, {"DOBA": 20, "DATUM ROĐENJA": 1468962431394, "PUNO IME": "Janette Doe "}]

Također možemo ići dalje i početi prilagođavati izlaz i kontrolirati stvari poput naručivanje, datum formatiranje, ili serializacija zastave.

Na primjer - ažurirajmo grah i dodamo još nekoliko polja:

@JSONField (name = "AGE", serialize = false) private int age; @JSONField (name = "LAST NAME", redni = 2) private String lastName; @JSONField (name = "FIRST NAME", redni = 1) private String firstName; @JSONField (name = "DATUM ROĐENJA", format = "dd / MM / yyyy", redni = 3) private Date dateOfBirth;

Evo popisa najosnovnijih parametara koje možemo koristiti uz @JSONField napomena, kako bi se prilagodio postupak pretvorbe:

  • Parametar formatkoristi se za pravilno formatiranje datoteke datum atribut
  • Prema zadanim postavkama knjižnica FastJson u cijelosti serializira Java zrno, ali možemo se poslužiti parametrom serializiratizanemariti serializaciju za određena polja
  • Parametar rednikoristi se za određivanje redoslijeda polja

I evo novog rezultata:

[{"IME": "Srna", "PREZIME": "Jhon", "DATUM ROĐENJA": "19.7.2016."}, {"IME": "Srna", "PREZIME": "Janette", "DATUM ROĐENJA": "19/07/2016"}]

FastJson također podržava vrlo zanimljivo BeanToArray serializacija značajka:

Niz jsonOutput = JSON.toJSONString (listOfPersons, SerializerFeature.BeanToArray);

Evo kako će izlaz izgledati u ovom slučaju:

[[15, 1469003271063, "John Doe"], [20, 1469003271063, "Janette Doe"]]

4. Stvorite JSON objekte

Kao i druge JSON knjižnice, stvaranje JSON objekta od nule prilično je jednostavno, samo je pitanje kombiniranja JSONObjecti JSONArrayobjekti:

@Test public void whenGenerateJson_thanGenerationCorrect () baca ParseException {JSONArray jsonArray = new JSONArray (); za (int i = 0; i <2; i ++) {JSONObject jsonObject = novi JSONObject (); jsonObject.put ("DOBA", 10); jsonObject.put ("PUNO IME", "Srna" + i); jsonObject.put ("DATUM ROĐENJA", "12.12.2016. 12:12:12"); jsonArray.add (jsonObject); } Niz jsonOutput = jsonArray.toJSONString (); }

I evo kako će ovdje izgledati izlaz:

[{"AGE": "10", "DATUM ROĐENJA": "2016/12/12 12:12:12", "PUNO IME": "Srna 0"}, {"AGE": "10", " DATUM ROĐENJA ":" 2016/12/12 12:12:12 "," PUNO IME ":" Srna 1 "}]

5. Analizirajte JSON nizove u Java objekte

Sad kad znamo kako stvoriti JSON objekt od nule i kako pretvoriti Java objekte u njihove JSON reprezentacije, stavimo fokus na raščlanjivanje JSON reprezentacije:

@Test public void whenJson_thanConvertToObjectCorrect () {Person person = new Person (20, "John", "Doe", new Date ()); Niz jsonObject = JSON.toJSONString (osoba); Osoba newPerson = JSON.parseObject (jsonObject, Person.class); assertEquals (newPerson.getAge (), 0); // ako postavimo serialize na false assertEquals (newPerson.getFullName (), listOfPersons.get (0) .getFullName ()); }

Možemo koristiti JSON.parseObject () da biste dobili Java objekt iz JSON Stringa.

Imajte na umu da morate definirati a no-args ili zadani konstruktor ako ste već deklarirali vlastiti parametarski, inače a com.alibaba.fastjson.JSONException bit će bačen.

Evo rezultata ovog jednostavnog testa:

Osoba [dob = 20, puno ime = John Doe, dateOfBirth = srijeda, 20. srpnja 08:51:12, ZAPAD 2016]

Korištenjem opcije deserializirati unutar @JSONField napomena, možemo zanemariti deserializaciju za određeno polje, u ovom će se slučaju zadana vrijednost automatski primijeniti na zanemareno polje:

@JSONField (name = "DATUM ROĐENJA", deserializirati = netačno) private Date dateOfBirth;

I evo novostvorenog objekta:

Osoba [dob = 20, puno ime = John Doe, dateOfBirth = null]

6. Konfigurirajte JSON pretvorbu pomoću ContextValueFilter

U nekim ćemo scenarijima možda trebati više kontrole tijekom procesa pretvorbe iz Java objekata u JSON format.

U ovom slučaju možemo koristiti ContextValueFilter objekt koji će primijeniti dodatno filtriranje i prilagođenu obradu na tok pretvorbe:

@Test public void givenContextFilter_whenJavaObject_thanJsonCorrect () {ContextValueFilter valueFilter = new ContextValueFilter () {public Object process (BeanContext context, Object object, String name, Object value) {if (name.equals ("DATE ​​OF B" ("DATE ​​OF B") OTKRITI "; } if (value.equals ("John")) {return ((String) value) .toUpperCase (); } else {vratiti nulu; }}}; Niz jsonOutput = JSON.toJSONString (listOfPersons, valueFilter); }

U ovom smo primjeru sakrili DATUM ROĐENJA polje, forsirajući konstantnu vrijednost, također smo zanemarili sva polja koja to nisu Ivan ili Srna:

[{"PUNO IME": "JOHN DOE", "DATUM ROĐENJA": "NE OTKRITI"}]

Kao što vidite, ovo je prilično osnovni primjer, ali naravno možete koristiti iste koncepte i za složenije scenarije - kombinirajući ove moćne i lagane alate koje FastJson nudi u stvarnom svjetskom projektu.

7. Korištenje NameFilter i SerializeConfig

FastJson nudi set alata za prilagodbu JSON operacija kada se radi s proizvoljnim objektima - objektima za koje nemamo izvorni kod.

Zamislimo da imamo kompiliranu verziju Osoba Java bean, prvobitno deklariran u ovom članku, i trebamo poboljšati imenovanje polja i osnovno formatiranje:

@Test javna praznina givenSerializeConfig_whenJavaObject_thanJsonCorrect () {NameFilter formatName = new NameFilter () {javni proces niza (objektni objekt, ime niza, vrijednost objekta) {return name.toLowerCase (). Replace ("", "_"); }}; SerializeConfig.getGlobalInstance (). AddFilter (Person.class, formatName); Niz jsonOutput = JSON.toJSONStringWithDateFormat (listOfPersons, "yyyy-MM-dd"); }

Proglasili smo formatName filtrirajte pomoću NameFilteranonimna klasa za obradu imena polja. Novostvoreni filtar pridružen je Osoba klase, a zatim se dodaje globalnoj instanci - koja je u osnovi statički atribut u SerializeConfig razred.

Sada svoj objekt možemo udobno pretvoriti u JSON format kao što je prikazano ranije u ovom članku.

Imajte na umu da smo koristili toJSONStringWithDateFormat () umjesto toJSONString () za brzu primjenu istog pravila oblikovanja na datumska polja.

I evo rezultata:

[{"full_name": "John Doe", "date_of_birth": "2016-07-21"}, {"full_name": "Janette Doe", "date_of_birth": "2016-07-21"}]

Kao što vidiš - promijenjena su imena polja, a vrijednost datuma je pravilno oblikovana.

Kombinirajući SerializeFilter s ContextValueFiltermože dati potpunu kontrolu nad procesom pretvorbe za proizvoljne i složene Java objekte.

8. Zaključak

U ovom smo članku pokazali kako koristiti FastJson za pretvaranje Java graha u JSON nizove i kako se obratiti. Također smo pokazali kako koristiti neke od osnovne značajke FastJsona kako bi se prilagodio JSON izlaz.

Kao što vidite, knjižnica nudi relativno jednostavan za korištenje, ali i dalje vrlo moćan API. JSON.toJSONString i JSON.parseObject su sve što trebate koristiti da biste udovoljili većini svojih potreba - ako ne i sve.

Primjere iz ovog članka možete provjeriti u povezani projekt GitHub.


$config[zx-auto] not found$config[zx-overlay] not found