FastJson關於java的使用

介紹

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章