1、什么是json序列化和反序列化?

json序列化:就是JavaBean对象转化为JSON格式的字符串。

反序列化:就是序列化的反方向,将字符串转化为JavaBean。

2、为什么要序列化和反序列化?

现在比较流行前后端分离的项目,前后端分离就离不开传递数据,一种好的数据表示形式让开发者和网站能轻易识别是很重要的,而这个数据表示形式就是json。这时候问题又来了,前端要json字符串,后端要javaBean对象(假设后端采用java语言)怎么办?此时就需要json的序列化和反序列化了。

3、流行的类库

json处理有三个比较流行的类库,分别是阿里巴巴开发的FastJson,谷歌开发的Gosn,和Spring Boot内置的Jackson

4、简单的json形式

{
	"myAge": 5,
	"myBirth": "2021-01-24 14:19:29 025",
	"myName": "小狗"
}

下边以fastjson为例

JSONField() 注解

@JSONField(ordinal = 1) //指定json序列化的顺序
@JSONField(serialize = false) //json序列化时忽略该字段
@JSONField(deserialize = false) //json反序列化时转成对象将忽略该字段
@JSONField(format = “yyyy-MM-dd HH:mm:ss SSS”) //时间格式转换

常用的方法

JSONObject.toJSONString(value) 将value对象转化成json字符串

JSONObject.parseObject(value,java.class) 将value转化成java对象

JSONObject.parseArray(value,java.class) 将value转化成java对象数组

如果不写java.class,只写value,会转成JSONObject字符串。

代码:

创建一个maven项目,导入fastjson和lombok。

lombok中的注解可以让我们不生产get和set方法

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.70</version>
    </dependency>

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.8</version>
    </dependency>

1、创建Animal.java类

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

import java.util.Date;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Animal {

    @JSONField(name = "myName")
    private String myName;

    @JSONField(name = "myAge")
    private int myAge;

    @JSONField(name = "myBirth",format = "yyyy-MM-dd HH:mm:ss SSS")
    private Date myBirth;

}

2、创建Persion.java类

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

import java.util.Date;


@Data
@AllArgsConstructor
@NoArgsConstructor
public class Persion {

    @JSONField(name = "name")
    private String name;

    @JSONField(name = "age")
    private int age;

    @JSONField(name = "Birth" ,format = "yyyy-MM-dd HH:mm:ss SSS")
    private Date Birth;

}

toJSONString() 的使用

将list集合转化成json

        List<Persion> persions = new ArrayList<Persion>();

        persions.add(new Persion("张三", 16, new Date()));
        persions.add(new Persion("李四", 18, new Date()));
        persions.add(new Persion("王五", 20, new Date()));
        persions.add(new Persion("麻子", 22, new Date()));
        //将list集合转化成json
        String jsonPersion= JSON.toJSONString(persions);
        System.out.println(jsonPersion);

输出结果如下:

[{
	"Birth": "2021-01-24 14:33:43 229",
	"age": 16,
	"name": "张三"
}, {
	"Birth": "2021-01-24 14:33:43 229",
	"age": 18,
	"name": "李四"
}, {
	"Birth": "2021-01-24 14:33:43 229",
	"age": 20,
	"name": "王五"
}, {
	"Birth": "2021-01-24 14:33:43 229",
	"age": 22,
	"name": "麻子"
}]

将map集合转化成json

        Map animal = new HashMap();

        animal.put("宠物狗",new Animal("小狗",5, new Date()));
        animal.put("波斯猫",new Animal("小猫",6, new Date()));
        animal.put("猪",new Animal("小猪",7, new Date()));

        //将list集合转化成json
        String jsonAnimal = JSON.toJSONString(animal);
        System.out.println(jsonAnimal);

输出结果如下:

{
	"宠物狗": {
		"myAge": 5,
		"myBirth": "2021-01-24 14:33:43 370",
		"myName": "小狗"
	},
	"猪": {
		"myAge": 7,
		"myBirth": "2021-01-24 14:33:43 370",
		"myName": "小猪"
	},
	"波斯猫": {
		"myAge": 6,
		"myBirth": "2021-01-24 14:33:43 370",
		"myName": "小猫"
	}
}

多层封装

一般一个请求,都是有请求头和请求体,它们里面又会有各种参数。

现在假如说有一个world世界类,包含了动物Animal类和Persion类,代码如下。

创建一个world.java

@Data
public class World {

    @JSONField(name = "Persion")
    private Persion Persion;

    @JSONField(name = "Animal")
    private Animal Animal;
}

测试

        World world = new World();
        Persion persion = new Persion("张三",18,new Date());

        Animal animal1 = new Animal("小狗",6,new Date());
        world.setPersion(persion);
        world.setAnimal(animal1);

        System.out.println(JSON.toJSONString(world));

输出结果

{
	"Animal": {
		"myAge": 6,
		"myBirth": "2021-01-24 15:32:31 392",
		"myName": "小狗"
	},
	"Persion": {
		"Birth": "2021-01-24 15:32:31 392",
		"age": 18,
		"name": "张三"
	}
}

实际封装的json要比和复杂一些。所以路还是很长的。

GitHub 加速计划 / js / json
37
5
下载
适用于现代 C++ 的 JSON。
最近提交(Master分支:5 个月前 )
34665ae6 binary -> binary_t Signed-off-by: Robert Chisholm <robert.chisholm@sheffield.ac.uk> 20 天前
f3dc4684 Bumps [github/codeql-action](https://github.com/github/codeql-action) from 3.28.9 to 3.28.10. - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/9e8d0789d4a0fa9ceb6b1738f7e269594bdd67f0...b56ba49b26e50535fa1e7f7db0f4f7b4bf65d80d) --- updated-dependencies: - dependency-name: github/codeql-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> 26 天前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐