加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

FastJson关于java的使用

发布时间:2020-12-16 18:56:24 所属栏目:百科 来源:网络整理
导读:介绍 Fastjson是阿里巴巴公司用java语言编写的json 的编辑解析器,个人感觉非常好用。 官方网址:http://code.alibabatech.com/wiki/display/FastJSON/Home. 可以在此网站与开发人员交流和查看更新。 下载地址:http://code.alibabatech.com/mvn/releases/co

介绍

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也没有关系。

[java] view plain copy
  1. importjava.util.List;
  2. publicclassChina{
  3. privateStringname;
  4. privateList<Province>province;
  5. publicStringgetName(){
  6. returnname;
  7. }
  8. voidsetName(Stringname){
  9. this.name=name;
  10. publicList<Province>getProvince(){
  11. returnprovince;
  12. voidsetProvince(List<Province>province){
  13. this.province=province;
  14. }
copy
classProvince{
  • privateCitycitys;
  • publicCitygetCitys(){
  • returncitys;
  • voidsetCitys(Citycitys){
  • this.citys=citys;
  • }

  • copy
    classCity{
  • privateString[]city;
  • publicString[]getCity(){
  • returncity;
  • }
  • voidsetCity(String[]city){
  • this.city=city;
  • }

  • 最后,测试一下:

    copy
    staticvoidmain(String[]args){
  • Chinachina=newChina();
  • china.setName("中国");
  • List<Province>provinces=newArrayList<>();
  • Provincehei=newProvince();
  • hei.setName("黑龙江");
  • CityheiCity=newCity();
  • heiCity.setCity(newString[]{"哈尔滨","大庆"});
  • hei.setCitys(heiCity);
  • provinces.add(hei);
  • Provinceguang=newProvince();
  • guang.setName("广东");
  • CityguangCity=newCity();
  • guangCity.setCity(newString[]{"广州","深圳","珠海"});
  • guang.setCitys(guangCity);
  • provinces.add(guang);
  • Provincetai= tai.setName("台湾");
  • CitytaiCity= taiCity.setCity(newString[]{"台北","高雄"});
  • tai.setCitys(taiCity);
  • provinces.add(tai);
  • china.setProvince(provinces);
  • Stringresult=JSON.toJSONString(china);



  • 结果:

    [plain] view plain copy
    1. {"name":"中国"
    2. "province":[
    3. {"citys":{"city":["哈尔滨","大庆"]},"name":"黑龙江"},
    4. {"citys":{"city":["广州","珠海"]},"name":"广东"},
    5. {"citys":{"city":["台北","高雄"]},"name":"台湾"}
    6. ]
    7. }

    结果的listarray的顺序是有序的,但是并列的键值对顺序是按照key的首字母ASCII顺序排列的。


    Json转化为对象

    和上述转化同理,列好了相对应的类,转化很方便。

    在上面测试代码后面加一句

    copy
    .....
  • Stringresult=JSON.toJSONString(china);//转成json字符串
  • System.out.println(result);
  • Chinac2=JSON.parseObject(result,China.class);//转成对象

  • 注意的部分:
    1,对象中想转化为json 的属性,必须拥有get方法。get方法的规范,方法名get后面的单词第一个字母要大写。
    2,key 的部分的属性名称(如:”name”)是基于类中该属性get方法方法名的那个单词产生的,只是把第一个字母的大写变成小写。

    转化时属性的过滤

    在对象生成json字符串时,只想转化一部分的属性,其他的不转化,怎么做呢?将上面转化的地方代码,替换如下:

    copy
    SimplePropertyPreFilterfilter=newSimplePropertyPreFilter(China.class,"name");
  • Stringresult=JSON.toJSONString(china,filter);

  • 结果如下:

    copy
    {"name":"中国"}

    注意:这个过滤是保留这部分内容,而不是过滤掉这部分内容!


    使用注释

    在某些场景,你可能需要定制序列化输出,比如说,希望序列化采用之后采用"ID",而不是"id",你可以使用@JSONField这个Annotation。

    public class User {
    @JSONField(name="ID")
    public int getId() { ... }
    }

    User user = ...;
    JSON.toJSONString(user); // {"ID":234}

    这样原本是id的标签变成了ID。

    针对这个@JSONField注解,当java对象转化成json对象时,是采用的get方法,所以这里必须要在get后面的第一个字母大写;而将json对象转化为java对象的时候,采用的是setter方法,那么我们也必须要注意,那么如果用@JSONField限定后,那么就会调用相关的方法。

    (编辑:李大同)

    【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

      推荐文章
        热点阅读