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":"臺灣"}
]
}

結果的listarray 的順序是有序的,但是並列的鍵值對順序是按照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":"中國"}

注意:這個過濾是保留這部分內容,而不是過濾掉這部分內容!


使用註釋

在某些場景,你可能需要定製序列化輸出,比如說,希望序列化採用之後採用"ID",而不是"id",你可以使用@JSONField這個Annotation。

public class User {
    @JSONField(name="ID")
    public int getId() { ... }
}
 
User user = ...;
JSON.toJSONString(user); // {"ID":234}

這樣原本是id的標籤變成了ID。


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