介紹
Fastjson是阿里巴巴公司用Java語言編寫的json 的編輯解析器,個人感覺非常好用。
官方網址:http://code.alibabatech.com/wiki/display/FastJSON/Home .
可以在此網站與開發人員交流和查看更新。
下載地址:http://code.alibabatech.com/mvn/releases/com/alibaba/fastjson/
號稱速度最快的json解析:數據如下,
我也沒測過,不知真假。
簡要談談Json
Json全稱JavaScript Object Notation ,是基於javascript的一個子集,是一種完全獨立語言的格式。它能迅速的取代XML成爲最受人歡迎的格式還是有它的原因的。
我們自己讀Json要從大局觀着手,有點耐心,先了解結構。
看看這個例子:
{
"name":"中國",
"province":[
{
"name":"黑龍江",
"cities":{
"city":["哈爾濱","大慶"]
}
},
{
"name":"廣東",
"cities":{
"city":["廣州","深圳","珠海"]
}
},
{
"name":"臺灣",
"cities":{
"city":["臺北","高雄"]
}
},
]
}
對於稍微是中國一點的人來說,這個例子很好懂,轉化到Json,那麼Json結構主要是兩部分:
1,映射:映射就是冒號那種形式,如–>”name”:”中國”,
2,序列:就是並列存在的province裏面的大括號是並列的,city裏面 的城市也是並列的。映射到程序裏相當於數組。
很多人說json就是鍵值對,很準確,更準確的是鍵值對套鍵值對,通常叫key-value對。
Key只能是string類型的,例如上面的name,city,province。
但是,value類型有很多,從簡單到複雜:
A: 基本類型(int,long,String).
B: 對象類型:對應程序將就是大括號,屬於自定義的部分,裏面還是Json類型。
C:序列類型:對應程序就是中括號,比如city後面的。。裏面的屬性是value類型,還可以套Json。
總的講,寫一個Json寫無數的鍵值對拼接起來。
代碼示例
Fastjson就是通過上面對json 的看法,將json的每個value對都映射到java對象中,達到轉化的目的。
代碼講解
生成Json
Fastjson是通過java對象來產生json的,我們來一步一步分析這個java對象是怎麼產生的。
1,最外層大括號
指一個對象,包含String屬性的 name和province屬性的province,province後面接的是一箇中括號,那麼這是一個array對象,我們把它定爲List<Province>province;
2, 容我懶惰,以此類推
在對象Province中的city是一個數組:String[] city,當然寫成list也沒有關係。
import java.util.List;
public class China {
private String name;
private List<Province>province;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Province> getProvince() {
return province;
}
public void setProvince(List<Province> province) {
this.province = province;
}
}
public class Province {
private City citys;
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public City getCitys() {
return citys;
}
public void setCitys(City citys) {
this.citys = citys;
}
}
public class City {
private String[]city;
public String[] getCity() {
return city;
}
public void setCity(String[] city) {
this.city = city;
}
}
最後,測試一下:
public static void main(String[] args) {
China china = new China();
china.setName("中國");
List<Province> provinces = new ArrayList<>();
Province hei = new Province();
hei.setName("黑龍江");
City heiCity = new City();
heiCity.setCity(new String[] { "哈爾濱", "大慶" });
hei.setCitys(heiCity);
provinces.add(hei);
Province guang = new Province();
guang.setName("廣東");
City guangCity = new City();
guangCity.setCity(new String[] { "廣州", "深圳", "珠海" });
guang.setCitys(guangCity);
provinces.add(guang);
Province tai = new Province();
tai.setName("臺灣");
City taiCity = new City();
taiCity.setCity(new String[] { "臺北", "高雄 " });
tai.setCitys(taiCity);
provinces.add(tai);
china.setProvince(provinces);
String result=JSON.toJSONString(china);
結果:
{"name":"中國"
"province":[
{"citys":{"city":["哈爾濱","大慶"]},"name":"黑龍江"},
{"citys":{"city":["廣州","深圳","珠海"]},"name":"廣東"},
{"citys":{"city":["臺北","高雄 "]},"name":"臺灣"}
]
}
結果的list和array 的順序是有序的,但是並列的鍵值對順序是按照key 的首字母ASCII 順序排列的。
Json轉化爲對象
和上述轉化同理,列好了相對應的類,轉化很方便。
在上面測試代碼後面加一句
.....
String result=JSON.toJSONString(china);//轉成json 字符串
System.out.println(result);
China c2=JSON.parseObject(result, China.class);//轉成對象
注意的部分:
1,對象中想轉化爲json 的屬性,必須擁有get方法。get方法的規範,方法名get後面的單詞第一個字母要大寫。
2,key 的部分的屬性名稱(如:”name”)是基於類中該屬性get方法方法名的那個單詞產生的,只是把第一個字母的大寫變成小寫。
轉化時屬性的過濾
在對象生成json字符串時,只想轉化一部分的屬性,其他的不轉化,怎麼做呢?將上面轉化的地方代碼,替換如下:
SimplePropertyPreFilter filter = newSimplePropertyPreFilter(China.class, "name");
String result = JSON.toJSONString(china, filter);
結果:
{"name":"中國"}
注意:這個過濾是保留這部分內容,而不是過濾掉這部分內容!
使用註解
1.在某些場景,你可能需要定製序列化輸出,比如說,希望序列化採用之後採用”ID”,而不是”id”,你可以使用@JSONField這個Annotation。
public class User {
@JSONField(name=”ID”)
public int getId() { … }
}
User user = …;
JSON.toJSONString(user); // {“ID”:234}
這樣原本是id的標籤變成了ID。
2.該字段不進行序列化。
@JSONField(serialize = false)
public int getId() { … }
3.對時間字段進行格式化處理,不處理是時間戳格式。
@JSONField (format=”yyyy-MM-dd”)
public Date getDate() { … }
轉自:http://blog.csdn.net/yunxiaoxiaoyun/article/details/16811973