fastjson:Otvorena JSON parser biblioteka Alibabe
01, Prošlost i sadašnjost
Ja sam fastjson, pravi Hangzhou lokalac, ali uvek nosim ambiciju da idem u ceo svet. Zato sam na GitHubu promenio uvod na engleski, internacionalni stil je vrlo snažan, zar ne?

Ako vaše englesko znanje nije tako sjajno kao kod mog šefa 666, mogu jednostavno prevesti (govorim ljudski jezik, ne pravim se važan).
Ja sam otvorena JSON parser biblioteka Alibabe, može serijalizovati Java objekte u JSON stringove, takođe može deserializovati JSON stringove u Java objekte.
Pružam alate za parsiranje na serverskoj strani i Android klijentu, performanse su prilično dobre.
Pružam pogodan način za međusobnu konverziju Java objekata i JSON, metod
toJSONString()se koristi za serijalizaciju, metodparseObject()se koristi za deserializaciju.Dozvoljavam konverziju postojećih objekata koji se ne mogu modifikovati (samo klasa, bez izvornog koda).
Imam široku podršku za Java generičke tipove.
Podržavam proizvoljno složene objekte (duboka hijerarhija nasleđivanja).
- godine, bio sam izabran od strane Open Source China kao jedan od najpopularnijih domaćih otvorenih softvera. Nakon mnogo godina, moj trend popularnosti se nije smanjio, u JSON domenu, usudim reći da sam br. 1, jer broj mojih fanova na GitHubu je premašio 22k, niko ne može zanemariti moje dostignuće.
02, Vodič za upotrebu
Pre nego što koristite moj API, treba prvo uvesti moju zavisnost u fajl pom.xml.
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.58</version>
</dependency>Napišite jednostavan test slučaj, pogledajte.
public class Test {
public static void main(String[] args) {
Writer writer = new Writer();
writer.setAge(18);
writer.setName("Chenmo Wang Er");
String json = JSON.toJSONString(writer);
System.out.println(json);
}
}
class Writer {
private int age;
private String name;
// getter/setter
}Writer je obična Java klasa, ima dva polja, redom age i name, i njihove getter i setter metode.
U metodu main() se kreira jedan Writer objekat, zatim poziva jednu moju statičku metodu JSON.toJSONString() da dobije JSON string.
Pogledajmo rezultate nakon štampanja.
{"age":18,"name":"Chenmo Wang Er"}Ako želite deserializaciju, izvršite sledeći kod.
Writer writer1 = JSON.parseObject(json, Writer.class);Pozovite statičku metodu JSON.parseObject(), prosledite dva parametra, jedan je JSON string, drugi je tip objekta.
Ako želite da pretvorite JSON string u kolekciju, treba pozvati drugu statičku metodu JSON.parseArray().
List<Writer> list = JSON.parseArray("[{\"age\":18,\"name\":\"Chenmo Wang Er\"},{\"age\":19,\"name\":\"Chenmo Wang Yi\"}]", Writer.class);Ako nemate posebnih zahteva, usudim reći da gore 3 metode mogu pokriti vašu većinu poslovnih scenarija.
03, Korišćenje anotacija
Ponekad, ključ u JSON stringu možda se ne poklapa sa poljem u Java objektu, na primer veličina slova; ponekad, treba specificirati neka polja da se serijalizuju ali ne deserializuju; ponekad, treba da polje datuma prikaže u određenom formatu.
Ove posebne scenarije, ja sam za vas sve razmotrio, samo treba dodati anotaciju @JSONField na odgovarajuće polje.
Prvo hajde da vidimo definiciju anotacije @JSONField.
public @interface JSONField {
String name() default "";
String format() default "";
boolean serialize() default true;
boolean deserialize() default true;
}name se koristi da specificira ime polja, format se koristi da specificira format datuma, serialize i deserialize se koriste da specificira da li se serijalizuje i deserializuje.
class Writer {
private int age;
private String name;
private Date birthday;
@JSONField(format = "yyyy.MM.dd")
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
@JSONField(name = "Age")
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@JSONField(serialize = false,deserialize = true)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}Predlažem da koristite anotaciju @JSONField na getter polju. Hajde da vidimo test kod.
Writer writer = new Writer();
writer.setAge(18);
writer.setName("Chenmo Wang Er");
writer.setBirthday(new Date());
String json = JSON.toJSONString(writer);
System.out.println(json);U ovom trenutku rezultati izlaza su kao sledeći.
{"Age":18,"birthday":"2020.12.17"}Prvo slovo ključa Age u JSON stringu je veliko, format birthday se poklapa sa očekivanjem "godina mesec dan", polje name se ne pojavljuje u rezultatu, to znači da nije serijalizovano.
04, Karakteristike serijalizacije
Da bi se zadovoljile više individualnih potreba, definisao sam mnoge karakteristike u klasi SerializerFeature, možete specificirati kada pozivate metod toJSONString().
PrettyFormat, da JSON format bude lepši štampan
WriteClassName, izlazi ime klase
UseSingleQuotes, ključ koristi jednostruke navodnike
WriteNullListAsEmpty, List je prazan onda izlazi []
WriteNullStringAsEmpty, String je prazan onda izlazi ""
I tako dalje, još mnogo novih veština, čekaju da otključate. Ovde napisam jednostavan demo za vašu referencu.
System.out.println(JSON.toJSONString(writer,
SerializerFeature.PrettyFormat,
SerializerFeature.UseSingleQuotes));Uporedite rezultate pre i posle konfiguracije.
{"Age":18,"birthday":"2020.12.17"}
{
'Age':18,
'birthday':'2020.12.17'
}05, Zašto sam brz
Kao što svi znaju, pretvaranje Java objekata u JSON string, nemoguće je koristiti direktno spajanje stringova, jer performanse su vrlo loše. Bolji način od spajanja stringova je korišćenje StringBuilder.
Iako je StringBuilder veoma dobar, u performansama ima još prostora za unapređenje. "Sami radite, adekvatno se hranite", zato sam kreirao klasu SerializeWriter, specijalizovanu za serijalizaciju.
Klasa SerializeWriter sadrži jedan char[] buf, svaki put kada serijalizuje, mora dodeliti jednom, ali sam koristio ThreadLocal da optimizujem, tako da mogu efikasno smanjiti dodeljivanje objekata i sakupljanje otpada, time poboljšavam performanse.
private final static ThreadLocal<char[]> bufLocal = new ThreadLocal<char[]>();
public SerializeWriter(java.io.Writer writer, int defaultFeatures, SerializerFeature... features){
this.writer = writer;
buf = bufLocal.get();
if (buf != null) {
bufLocal.set(null);
} else {
buf = new char[2048];
}
}Osim toga, postoje i mnogi drugi detalji, na primer korišćenje IdentityHashMap umesto HashMap, može izbeći suvišne operacije equals, i može izbeći beskonačnu petlju u konkurentnoj situaciji.
/**
* for concurrent IdentityHashMap
*
* @author wenshao[szujobs@hotmail.com]
*/
@SuppressWarnings("unchecked")
public class IdentityHashMap<K, V> {
private final Entry<K, V>[] buckets;
private final int indexMask;
public final static int DEFAULT_SIZE = 8192;
}Na primer, korišćenje asm tehnologije da bi se izbeglo opterećenje refleksije.

Priznajem, uz brzinu, takođe donosi neke probleme bezbednosti. Naročito uvođenje AutoType-a, daje hakera priliku.
1.2.59 objavljeno, pojačava bezbednost kada je AutoType uključen
1.2.60 objavljeno, dodaje AutoType crnu listu, popravlja problem bezbednosti odbijanja servisa
1.2.61 objavljeno, dodaje AutoType bezbednosnu crnu listu
1.2.62 objavljeno, dodaje AutoType crnu listu, pojačava deserializaciju datuma i JSONPath
1.2.66 objavljeno, popravlja bagove pojačava bezbednost, i pojačava bezbednost, dopunjava AutoType crnu listu
1.2.67 objavljeno, popravlja bagove pojačava bezbednost, dopunjava AutoType crnu listu
1.2.68 objavljeno, podržava GEOJSON, dopunjava AutoType crnu listu (uvela bezbednosni režim safeMode, nakon konfiguracije safeMode, bez obzira na belu listu i crnu listu, ne podržava autoType.)
1.2.69 objavljeno, popravlja novo otkriveni ozbiljan bezbednosni propust zaobilaska AutoType prekidača, dopunjava AutoType crnu listu
1.2.70 objavljeno, poboljšava kompatibilnost, dopunjava AutoType crnu listu
U stalnoj borbi sa hakerima, iako sam postajao sve više stabilan i zreo, ali u isto vreme, korisnici su platili tešku cenu.

Takođe su se pojavili mnogi disonantni glasovi na internetu, tvrde da sam jedan od najgorih domaćih otvorenih softvera, samo kroz oportunizam osvojio poverenje domaćih developera.
Ali više je, ostalo je mnogo ljudi koji me ne napuštaju.

Rečenica kojom sam najviše potresen je:
Gospodin Wen skoro je sam snagom podigrao široko korišćenu JSON biblioteku, dok su druge biblioteke skoro sve oslanjale na ceo tim, samo po ovoj tački, gospodin Wen kao "nepromenjiv ljubavnik Alibabe prve generacije otvorenog koda", potpuno zaslužuje.
Nije strašno što se pojave propusti, strašno je ako ne može otkriti propuste, ili ne može rešiti propuste.
Da bi se konačno rešio problem koji donosi AutoType, u verziji 1.2.68, uveo sam bezbednosni režim safeMode, bez obzira na belu listu i crnu listu, ne podržava AutoType, tako da može potpuno sprečiti napade.

U bezbednosnom režimu, metod checkAutoType() će direktno baciti izuzetak.
06, Epilog
Bez obzira koliko je još teškoća i tegoba na putu napred, bez obzira koliko još glasova trač i kleveta treba da suočim, ja ću nastaviti da napredujem, za bujanje otvorenog softvera domaće proizvodnje, volim da budem pionir, i volim da budem borac duže vreme.
Poslednji članak 2020. godine! Ako ste videli, lajkajte, 2021. ide glatko.
