json转成map_一分钟学会 Json 和 Java 对象 互相转换

本文介绍了Jackson这一好用的JSON转换工具,阐述了序列化和反序列化的概念,即Java对象与JSON的相互转换。还说明了在SpringBoot中使用Jackson的方法,展示了Jackson与Object、List、Map的互转,以及处理自定义泛型类反序列化的特殊情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Jackson 是一款非常好用的 json 转换工具,可以帮助我们完成 json 和 Java 的 Object 的互相转换

什么是序列化和反序列化?

  • 序列化(Serialize) : 将 Java Object 转换成 json
  • 反序列化(Deserialize) : 将 json 转换成 Java Object

在 SpringBoot 裡使用 Jackson

只要在 maven 中加入 spring-boot-starter-web 的 dependency 就可以了

<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-webartifactId>
dependency>

Jackson 和 Object、List、Map 的互转

先定义一个 User 类

public class User {
    private int id;
    private String name;
    // 省略constructor, getter, setter
}

使用 Jackson 完成 json 和 Object、List、Map 的互转

import java.util.*;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;

public class MainTest {
    public static void main(String[] args) throws Exception {
        ObjectMapper objectMapper = new ObjectMapper();

        // User Object 转 json
        User user1 = new User(123, "John");
        String json = objectMapper.writeValueAsString(user1);

        // json 转 User Object
        User user2 = objectMapper.readValue(json, User.class);

        // List 转 json
        List ulist = new ArrayList<>();
        User user4 = new User(123, "John");
        ulist.add(user4);
        String ujson = objectMapper.writeValueAsString(ulist);// json 转 List
        List urlist = objectMapper.readValue(ujson, new TypeReference>() {});// Map 转 json
        HashMap umap = new HashMap<>();
        User user3 = new User(123, "John");
        umap.put("John", user3);
        String mjson2 = objectMapper.writeValueAsString(umap);// json 转 Map
        Map urMap = objectMapper.readValue(mjson2, new TypeReference>() {});
    }
}

Deserialize 自定义的泛型类

如果要 deserialize 的是自定义的泛型类,那就需要特殊处理,不能够像 ListMap 那样直接用 TypeReference 互转

原因是因为 List 实际上存的还是 Object,他只是取出来的时候强行转换成 T 而已

先定义一个泛型类

public class Hit<T> {
    private Integer id;
    private T source;
    // 省略getter, setter
}

再定义一个正常的 Apple 类

public class Apple {
    private String color;
    private Integer weight;
    //省略getter/setter
}

待转换的 json

{
    "id": 111,
    "source": {
        "color": "red",
        "weight": 100
    }
}

使用 Jackson 将 json 转换成带有泛型的类

public class MyTest {
    // 使用 Jackson 将 json 转成泛型类的方法
    public static  Hit convert(String json, Class targetClass) throws Exception {
        ObjectMapper objectMapper = new ObjectMapper();
        Hit hit = null;
        JavaType clazzType = objectMapper.getTypeFactory().constructParametricType(Hit.class, targetClass);
        hit = objectMapper.readValue(json, clazzType);return hit;
    }public static void main(String[] args) {// 实际用起来会像这样
        String json = "{\"id\": 111,\"source\": {\"color\": \"red\",\"weight\": 100}}";
        Hit appleHit = convert(json, Apple.class);
    }
}

9149e31c3d5ff1344af0577feb8f4e5e.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值