自学内容网 自学内容网

【技术】Jaskson的序列化与反序列化

概念解释

1.Jaskson

Jackson 是一个用于处理 JSON 数据的 Java 库,所以,在了解Jackson之前,我们可以先来了解JSON

a.JSON

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人类阅读和编写,同时也易于机器解析和生成。JSON 是基于文本的格式,通常用于在客户端和服务器之间交换数据

JSON 的基本特点

轻量级:JSON 格式简单,数据量小,适合网络传输。
易于阅读: JSON 的结构清晰,易于理解,便于调试。
语言无关: 虽然 JSON 源于 JavaScript,但它被广泛支持于多种编程语言(如 PythonJavaC# 等)。
数据结构: JSON 支持基本的数据类型,如字符串、数字、布尔值、数组和对象。

JSON 的基本结构

JSON 数据由两种结构组成:

  • 对象(Object:由大括号 {} 包围,包含一组键值对。键(key)是字符串,值(value)可以是任意有效的 JSON 数据类型。
{
    "name": "Alice",
    "age": 30,
    "isStudent": false
}

数组(Array): 由方括号 [] 包围,包含一组值,值可以是任意有效的 JSON 数据类型。

[
    "apple",
    "banana",
    "cherry"
]
JSON 示例

以下是一个包含不同类型的 JSON 数据的示例:

{
    "name": "Alice",
    "age": 30,
    "isStudent": false,
    "courses": ["Math", "Science", "History"],
    "address": {
        "street": "123 Main St",
        "city": "Anytown",
        "zip": "12345"
    }
}

b.ObjectMapper类

ObjectMapper类(com.fasterxml.jackson.databind.ObjectMapper)是Jackson的主要类,它可以帮助我们快速的进行各个类型Json类型的相互转换

2.序列化与反序列化

a.序列化

对象序列化

JSON序列化是将Java对象转换为JSON字符串的过程。在JSON序列化过程中,Java对象的属性将被转换为JSON对象的键值对,如果Java对象包含其他Java对象或集合,这些嵌套对象也会被转换为嵌套的JSON对象和JSON数组

Java对象转换为JSON字符串最基本的方法就是使用​​ObjectMapper​​​类的​​writeValueAsString​​方法。这个方法接收一个Java对象作为参数,返回一个JSON字符串.
示例:

@Data
public class JacksonTest1 implements Serializable {
    public String name;
    public Integer age;

    public JacksonTest1(String name, Integer age){
        this.name=name;
        this.age=age;
    }
}
@Data
public class Test1 implements Serializable {
    private String  msg;
    private Integer age;
    private JacksonTest1 test;

    public Test1(String msg, Integer age, JacksonTest1 test){
        this.msg=msg;
        this.age=age;
        this.test=test;
    }
}
@Slf4j
@SpringBootTest
public class JacksonTest {
    @Test
    void test(){
        JacksonTest1 test=new JacksonTest1("zhangsan",11);
        Test1 test1=new Test1("lisi",18,test);
        ObjectMapper objectMapper=new ObjectMapper();
        try {
            String result=objectMapper.writeValueAsString(test1);
            log.info(result);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
    }
}

运行结果:
在这里插入图片描述
这里发现:
Test1对象的属性将被转换为JSON对象的键值对,其中Jascson1作为嵌套在Test1内的对象,被转换为嵌套的JSON对象
在这里插入图片描述

集合序列化

除了序列化单个Java对象,Jackson库还支持序列化Java集合,包括​​List​​​、​​Set​​​和​​Map​​​等。可以使用​​ObjectMapper​​​类的​​writeValueAsString​​方法将Java集合序列化为JSON字符串。

List
@Test
    void jacksonTest2() throws JsonProcessingException {
        ObjectMapper objectMapper=new ObjectMapper();
        List<String> list=new ArrayList<>();
        list.add("张三");
        list.add("李四");
        list.add("王五");
        list.add("赵六");
        System.out.println(objectMapper.writeValueAsString(list));
    }

运行结果:
在这里插入图片描述

Set
@Test
    void jacksonTest3() throws JsonProcessingException {
        ObjectMapper objectMapper=new ObjectMapper();
        Set<String> set=new HashSet<>();
        set.add("张三");
        set.add("李四");
        set.add("王五");
        set.add("张三");
        System.out.println(objectMapper.writeValueAsString(set));
    }

运行结果:
在这里插入图片描述

Map
@Test
    void jacksonTest4() throws JsonProcessingException {
        ObjectMapper objectMapper=new ObjectMapper();
        Map<String,Integer>  map=new HashMap<>();
        map.put("zhansgan",14);
        map.put("lisi",15);
        map.put("wangwu",16);
        map.put("zhaoliu",17);
        System.out.println(objectMapper.writeValueAsString(map));

    }

运行结果:
在这里插入图片描述

b.反序列化

反序列化单个对象

JSON反序列化是将JSON字符串转换为Java对象的过程。在JSON反序列化过程中,JSON对象的键值对将被转换为Java对象的属性,如果JSON对象包含其他JSON对象或JSON数组,这些嵌套的JSON也会被转换为嵌套的Java对象和Java集合。

JSON字符串转换为Java对象的基本方法是使用​​ObjectMapper​​​类的​​readValue​​方法。这个方法接收两个参数:一个JSON字符串和一个Java类,它会将JSON字符串反序列化为指定的Java类对象。

@Test
    void jacksonTest1() throws JsonProcessingException {
        ObjectMapper objectMapper = new ObjectMapper();

        CommonResult<String> commonResult = CommonResult.fail(500, "系统错误");
        String str;

        //序列化
            str = objectMapper.writeValueAsString(commonResult);
            log.info(str);


        //反序列化
        CommonResult<String> result= objectMapper.readValue(str,CommonResult.class);
        System.out.println("code: "+result.getCode()+" errMsg: "+result.getErrMsg());

    }

运行结果:
在这里插入图片描述

反序列化集合对象

除了反序列化单个Java对象,Jackson库还支持反序列化Java集合,包括​​List​​​、​​Set​​​和​​Map​​​等。但是不可以直接使用​​ObjectMapper​​​类的​​readValue​​方法将JSON字符串反序列化为Java集合,还需要搭配使用 TypeReference<T>

原因:

  • 类型不明确readValue方法在反序列化时需要明确目标类型。如果目标类型是一个通用的集合类型(如 ListMap),而没有提供具体的实现类(如 ArrayListHashMap),则可能导致反序列化失败或产生不正确的结果。

  • 类型擦除:在 Java 中,泛型是通过类型擦除实现的,这意味着在运行时,泛型类型的信息会丢失。这可能导致在反序列化时无法正确识别集合中元素的类型

  • JSON格式问题:如果反序列化的数据格式与目标集合类型不匹配(例如,JSON数组与预期的集合类型不一致),也会导致反序列化失败

  • 库的限制:某些反序列化库可能对集合的处理有特定的要求,可能需要使用特定的方法或构造函数,而不是通用的 readValue 方法。

所以,正确的使用方法是::在调用 readValue 时,使用具体的集合类型。例如,可以使用 TypeReference 来指定具体的泛型类型
List<MyClass> myList = objectMapper.readValue(jsonString, new TypeReference<List<MyClass>>() {});


原文地址:https://blog.csdn.net/2301_78320637/article/details/142643818

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!