大数据必备基础:Json框架之FastJson

今天分享又来了呀。ღ( ´・ᴗ・` ) 一起学习进步ღゝ◡╹)ノ♡

摘要:

  1. 什么是json

  2. FastJson介绍

  3. FastJson序列化API

  4. FastJson反序列化API

加油,好好学习,天天向上~ 

Q:

一、什么是json

JSON:(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。

所谓的数据交换,指目前互联网技术开发,有客户端和服务器,两者之间进行数据交换,客户端发送数据给服务器,服务器相应消息给客户端,这两者之间传输的数据是json的格式。

它基于 JavaScript(欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。目前,Json处于数据交换语言的王者地位。

Json只有两种数据格式

①Json数组格式

Json的数据本身是数组,用中括号包裹,证明这是一个数组,数组的元素之间逗号分开。数组元素的数据类型没有限制,什么类型都可以。

var jsonArray = ["元素1","元素2","元素3"]; //定义数组格式json
console.log(jsonArray[0]); //通过索引访问json数组的元素


for(var i = 0 ; i < jsonArray.length ; i++){
    console.log(jsonArray[i]); //遍历数组,访问每个元素
}

②Json对象格式

Json的数据本身是对象,用大括号包裹。对象采用键值对形式存储,键固定为字符串类型,值是任意类型的数据。键和值使用冒号分开.

var jsonObject = {"k1":"v1","k2":"v2","k3":"v3"}; //定义对象格式json
console.log(jsonObject.k1); //取出键k1对应的值

数组、对象相互嵌套格式

1 json数组中的每一个元素都是对象

var jsonArray = [
    {"k1":"v1"},
    {"k2":"v2"}
]; // 定义数组格式json,数组元素是对象
console.log(jsonArray[0].k1); //访问数组0索引的元素,该元素的键k1对应的值


2 json数据是对象,对象中的值是数组

var jsonObject = {
    "k1":["元素1","元素2"],
    "k2":["元素1","元素2"]
}; // 定义对象格式json,键是字符串类型,值是数组
console.log(jsonObject.k1[0]); //访问对象的键是k1,对于的值为数组,数组的0索引元素


取出k1的数组,遍历:
for (var i = 0; i< jsonObject.k1.length;i++){
    console.log(jsonObject.k1[i]);
}


3 json的数据嵌套,你中有我,我中有你

var json = {
    //键是k1,值是数组,数组的元素是对象
    "k1":[
      "元素1",{"key1":"value1"},{"key2":"value2"}
    ],
    "k2":[
        {"name":"张三","age":24},
        {"name":"李四","age":26}
    ]
}; //定义对象格式json,键是字符串,值是数组,数组的元素是对象
console.log(json.k1[1].key1); //访问json对象的键k1,对应的是数组,访问数组的1索引,数组的1索引上的元素是对象,访问key1键对应的值


//取出数据张三 22 
console.log(json.k2[1].name + "==" + json.k2[1].age);


//遍历k2键对应的数组
for(var i = 0; i<json.k2.length;i++){
    console.log(json.k2[i].name + "==" + json.k2[i].age);
}


json的数据本质上是对象。

对象的键是字符串,对象的值是数组。

数组的元素是对象。

Q:

二、FastJson介绍


FastJson 是阿里巴巴的开源JSON解析库,它可以解析 JSON 格式的字符串,支持将 Java Bean 序列化为 JSON 字符串,也可以从 JSON 字符串反序列化到 JavaBean。

Fastjson 的优点

  • 速度快fastjson相对其他JSON库的特点是快,从2011年fastjson发布1.1.x版本之后,其性能从未被其他Java实现的JSON库超越。

  • 使用广泛fastjson在阿里巴巴大规模使用,在数万台服务器上部署,fastjson在业界被广泛接受。在2012年被开源中国评选为最受欢迎的国产开源软件之一。

  • 测试完备fastjson有非常多的testcase,在1.2.11版本中,testcase超过3321个。每次发布都会进行回归测试,保证质量稳定。

  • 使用简单fastjson的 API 十分简洁。

  • 功能完备支持泛型,支持流处理超大文本,支持枚举,支持序列化和反序列化扩展。

Q:

三、FastJson序列化API

序列化 : 是指将Java对象转成json格式字符串的过程。JavaBean对象,List集合对象,Map集合,为应用最广泛的.

  • JSON.toJSONString,Json类的静态方法。

    java中的对象,student对象,序列化为Json格式字符串

    • 序列化Java对象

import com.alibaba.fastjson.annotation.JSONField;
import lombok.Data;


import java.util.Date;


@Data
public class Student {
    private Integer id;


    //@JSONField 注解属性 name ,指定序列化后的名字
    //@JSONField 注解属性 ordinal ,指定序列化后的字段顺序  属性值越小,顺序靠前
    @JSONField(name = "studentName",ordinal = 1)
    private String name;


    @JSONField(ordinal = 2)
    private Integer age;


    //@JSONField 注解属性 serialize ,指定是否序列化该字段
    @JSONField(serialize = false)
    private String email;


    //@JSONField 注解属性 format 指定序列化后的格式
    @JSONField(format = "YYYY-MM-dd")
    private Date birthday;
    private Boolean flag;
}
@Test
    //Java中的对象,Student对象,序列化为Json格式字符串
    public void testObjectToJson(){
        Student student = new Student();
        student.setId(1);
        student.setName("张三");
        student.setAge(20);
        student.setEmail("zs@sina.com");
        student.setBirthday(getDate());
        //student对象,转到Json格式字符串
        //调用静态方法,传递要转换的对象
        String jsonString = JSON.toJSONString(student);
        System.out.println(jsonString);
        //{"age":20,"birthday":1584257759911,"email":"zs@sina.com","id":1,"name":"张三"}
        //可以看见,这是一个json对象格式的字符串,是在被大括号包裹。
    }

JSON.toJSONString

  • 序列化List集合

@Test
    //Java中的集合对象List,序列化为Json格式字符串
    public void testListToJson(){
        //创建个集合List,存储Student对象
        List<Student> list = new ArrayList<Student>();
        Student student1 = new Student();
        student1.setId(1);
        student1.setName("张三");
        student1.setAge(20);
        student1.setEmail("zs@sina.com");
        student1.setBirthday(getDate());


        Student student2 = new Student();
        student2.setId(2);
        student2.setName("李四");
        student2.setAge(22);
        student2.setEmail("ls@126.com");
        student2.setBirthday(getDate());
        //Student对象存储到List集合中
        list.add(student1);
        list.add(student2);
        //List集合,序列化为Json格式字符串


        String jsonString = JSON.toJSONString(list);
        System.out.println(jsonString);
        //转后的结果,是数组,数组的元素是对象
        //[{"age":20,"birthday":1584258063781,"email":"zs@sina.com","id":1,"name":"张三"},
        // {"age":22,"birthday":1584258063781,"email":"ls@126.com","id":2,"name":"李四"}]
        //json数组形式,因为是中括号包裹。
    }

JSON.toJSONString

  • 序列化Map集合

@Test
    //Java中的集合Map,序列化为Json格式字符串
    public void testMapToJson(){
        //创建Map集合,键为字符串类型,值是Student对象
        Map<String,Student> map = new HashMap<String, Student>();
        Student student1 = new Student();
        student1.setId(1);
        student1.setName("张三");
        student1.setAge(20);
        student1.setEmail("zs@sina.com");
        student1.setBirthday(getDate());


        Student student2 = new Student();
        student2.setId(2);
        student2.setName("李四");
        student2.setAge(22);
        student2.setEmail("ls@126.com");
        student2.setBirthday(getDate());


        Map集合存储Student对象
        map.put("student1",student1);
        map.put("student2",student2);
        String jsonString = JSON.toJSONString(map);
        System.out.println(jsonString);
        //json是对象格式字符串,对象中有2个键,键对应的值是Student对象
        //{"student2":{"age":22,"birthday":1584260793271,"email":"ls@126.com","id":2,"name":"李四"},
        // "student1":{"age":20,"birthday":1584260793271,"email":"zs@sina.com","id":1,"name":"张三"}}
    }

Q:

四、FashJson反序列化API


JSON.parseObject

  • 反序列化Java对象

@Test
    //Json格式字符串,反序列化回到Java对象
    public void testJsonToObject(){
        String jsonString = "{\"age\":20,\"birthday\":1584257759911,\"email\":\"zs@sina.com\",\"id\":1,\"name\":\"张三\"}";


        //JSON类的静态方法 parseObject
        //传递要反序列化的Json字符串,传递Java对象的class对象
        Student student = JSON.parseObject(jsonString,Student.class);
        System.out.println(student);
        //Student(id=1,name=张三,age=20,email=zs@sina.com,birthday=Sun Mar 15 15:35:59 CST 2020)
    }

JSON.parseArray

  • 反序列化List集合

@Test
    //Json格式字符串,反序列化回到Map集合
    public void testJsonToMap(){
        String jsonString = "{\"student2\":{\"age\":22,\"birthday\":1584260793271,\"email\":\"ls@126.com\",\"id\":2,\"name\":\"李四\"},\"student1\":{\"age\":20,\"birthday\":1584260793271,\"email\":\"zs@sina.com\",\"id\":1,\"name\":\"张三\"}}";
        
//JSON类的静态方法,parseObject
        //直接进行反序列化,此时Map集合是没有泛型的。
        // 没有泛型的集合是不安全的集合,所以转后的集合,必须有泛型,解决方法如下:
        //调用parseObject,传递参数,TypeReference类型,在TypeReference类的泛型中,传递转后的Map集合
        Map<String,Student> map = JSON.parseObject(jsonString,new TypeReference<Map<String,Student>>(){});
        
         因为这个类TypeReference的构造方法是用protected权限修饰符修饰的,所以我们不能去调用。为什么,因为我们不是它的子类。
         为了避免使用“继承”成为子类;我们在new对象时在后面加上大括号{}就称为它的子类了
         匿名内部类,就是它子类的匿名对象,所以我们可以用这种方式new TypeReference<Map<String,Student>>(){}来代替他的子类类型     我就把这个当成一种特定的语法吧。


        for (String key : map.keySet()){ //打印键和值
            System.out.println(key +"::"+map.get(key));
        }
    }
    //student2::Student(id=2, name=null, age=22, email=ls@126.com, birthday=Sun Mar 15 16:26:33 CST 2020, flag=null)
    //student1::Student(id=1, name=null, age=20, email=zs@sina.com, birthday=Sun Mar 15 16:26:33 CST 2020, flag=null)

- END -

本文为原创文章

❤:在这里跟我一起学习技术、职场、人生、原理、健身、摄影、生活等知识吧!

❤: 欢迎点个关注一起学习,进步充实人生。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值