• java json转换


    https://blog.csdn.net/WillJGL/article/details/77866224

    SpringBoot中如果需要实现json的序列化和反序列化,我们会使用json解析工具。一般用到的有fastjson、GSON、Jackson
    根据网上的测试,Jackson性能好一些,而且Jackson是SpringBoot默认引用的
    本文记录SpringBoot如何使用Jackson

    准备

    1、在项目中创建包Jackson
    2、分别创建4各类文件
    2.1、Company实体类(里面包含Department的list)
    2.2、Department实体类
    2.3、jsonController controller类,接收测试请求
    2.4、JsonHelper Jackson操作类
    如题所示
    这里写图片描述

    每个类内容如下
    Company

    
    import java.util.ArrayList;
    import java.util.List;
    
    public class Company {
    
        private  String name;
        private  String address;
        private  int employeesCount;
        private List<Department> departmentArrayList;
    
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getAddress() {
            return address;
        }
    
        public void setAddress(String address) {
            this.address = address;
        }
    
        public int getEmployeesCount() {
            return employeesCount;
        }
    
        public void setEmployeesCount(int employeesCount) {
            this.employeesCount = employeesCount;
        }
    
        public List<Department> getDepartmentArrayList() {
            return departmentArrayList;
        }
    
        public void setDepartmentArrayList(List<Department> departmentArrayList) {
            this.departmentArrayList = departmentArrayList;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    Department

    
    public class Department {
    
        private  String name;
        private  int employeesCount;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getEmployeesCount() {
            return employeesCount;
        }
    
        public void setEmployeesCount(int employeesCount) {
            this.employeesCount = employeesCount;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    jsonController

    
    import com.fasterxml.jackson.core.JsonProcessingException;
    import com.fasterxml.jackson.core.type.TypeReference;
    import com.fasterxml.jackson.databind.JavaType;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import java.util.*;
    
    @RestController
    @RequestMapping("/json")
    public class jsonController {
    
        private  final Logger logger = LoggerFactory.getLogger(this.getClass());//对象方式初始化Log对象
    
        @GetMapping("")
        public String index() throws Exception {
            JsonHelper jm = new JsonHelper();
    
            //1、对象<->Json
                //准备数据
            Company c = getCompany();
                //对象转Json
            String json =  jm.toJson(c);
            logger.info("1.1、对象转Json="+json);
                //Json转对象
            Company obj = jm.fromJson(json,Company.class);
            logger.info("1.2、Json转对象="+ obj.getDepartmentArrayList().get(0).getName());
    
            //2、Map<->Json
                //Json转Map
            Map map = jm.fromJson(json,Map.class);
            List<Map> tempList =  (List<Map>)map.get("departmentArrayList");
            logger.info("2.1、Json转Map="+tempList.get(0).get("name"));
    
                //Map转Json
            json =  jm.toJson(map);
            logger.info("2.2、Map转Json="+json);
    
            //3、List<Object> <->Json
                //准备数据
            List<Company> companyList = new ArrayList<Company>();
            companyList.add(getCompany());
            companyList.add(getCompany());
            companyList.add(getCompany());
    
                //List<Object>转Json
            json =  jm.toJson(companyList);
            logger.info("3.1、List<Object>转Json="+json);
    
                //Json转List<Object>
            List<Company> companyListDecode = jm.fromJson(json,new TypeReference<List<Company>>() {});
            logger.info("3.2、Json转List<Object>="+companyListDecode.get(0).getDepartmentArrayList().get(0).getName());
    
            //4、Map<String, Object><-> Json
                //准备数据
            Map<String, Company> map1 = new HashMap<String, Company>() ;
            map1.put("1",getCompany());
            map1.put("2",getCompany());
            map1.put("3",getCompany());
    
                //Map<String, Object>转Json
            json =  jm.toJson(map1);
            logger.info("4.1、Map<String, Object>转Json="+json);
    
                //Json转Map<String, Object>
            Map<String, Company> map1Decode = jm.fromJson(json,new TypeReference<Map<String, Company>>() {});
            logger.info("4.2、Json转Map<String, Object>="+map1Decode.get("1").getDepartmentArrayList().get(0).getName());
    
            //5、List<Map<String, Object>><->Json
                //准备数据
            List<Map<String, Company>> listMap =new ArrayList<Map<String, Company>>();
            Map<String, Company> map2 = new HashMap<String, Company>() ;
            map2.put("a",getCompany());
            map2.put("b",getCompany());
            map2.put("c",getCompany());
            listMap.add(map1);
            listMap.add(map2);
    
                //List<Map<String, Object>> 转Json
            json =  jm.toJson(listMap);
            logger.info("5.1、List<Map<String, Object>> 转Json="+json);
    
                //Json 转 List<Map<String, Object>>
            List<Map<String, Company>> listMapDecode = jm.fromJson(json,new TypeReference<List<Map<String, Company>>>() {});
            logger.info("5.2、List<Map<String, Object>> 转Json="+listMapDecode.get(0).get("1").getDepartmentArrayList().get(0).getName());
    
            return "";
        }
    
    
        private  Company getCompany()
        {
            long time = new Date().getTime();
            String sTime =  String.valueOf(time);
            Company c = new Company();
            c.setEmployeesCount(10);
            c.setName("公司名"+sTime);
    
            List list = new ArrayList();
            Department d1= new Department();
            d1.setEmployeesCount(5);
            d1.setName("部门1"+sTime);
    
            Department d2= new Department();
            d2.setEmployeesCount(5);
            d2.setName("部门2"+sTime);
    
            list.add(d1);
            list.add(d2);
    
            c.setDepartmentArrayList(list);
    
            return  c;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120

    JsonHelper

    
    import com.fasterxml.jackson.annotation.JsonInclude;
    import com.fasterxml.jackson.core.JsonParser;
    import com.fasterxml.jackson.core.JsonProcessingException;
    import com.fasterxml.jackson.core.type.TypeReference;
    import com.fasterxml.jackson.databind.DeserializationFeature;
    import com.fasterxml.jackson.databind.JavaType;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.fasterxml.jackson.databind.SerializationFeature;
    import com.fasterxml.jackson.databind.util.JSONPObject;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import java.io.IOException;
    
    public class JsonHelper {
    
    
        private  Logger logger = LoggerFactory.getLogger(this.getClass());
        ObjectMapper mapper;
    
        public  JsonHelper()
        {
            mapper = new ObjectMapper();
            mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
            mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        }
    
        public  JsonHelper(JsonInclude.Include include)
        {
            mapper = new ObjectMapper();
            mapper.setSerializationInclusion(include);
            mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        }
    
    
        public  String toJson(Object object) throws JsonProcessingException {
            return mapper.writeValueAsString(object);
        }
    
        public  <T> T fromJson(String json, Class<T> cls) throws IOException {
            return mapper.readValue(json, cls);
        }
    
        public  <T> T fromJson(String json,TypeReference valueTypeRef) throws IOException {
            return mapper.readValue(json, valueTypeRef);
        }
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    转换方式

    共举例如下几种转换方式(整体在jsonController文件中,这里分别拆出来说明)

    对象<->Json

    //1、对象<->Json
            //准备数据
            Company c = getCompany();
            //对象转Json
            String json =  jm.toJson(c);
            logger.info("1.1、对象转Json="+json);
            //Json转对象
            Company obj = jm.fromJson(json,Company.class);
            logger.info("1.2、Json转对象="+ obj.getDepartmentArrayList().get(0).getName());
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    Map<->Json

    //2、Map<->Json
                //Json转Map
            Map map = jm.fromJson(json,Map.class);
            List<Map> tempList =  (List<Map>)map.get("departmentArrayList");
            logger.info("2.1、Json转Map="+tempList.get(0).get("name"));
    
                //Map转Json
            json =  jm.toJson(map);
            logger.info("2.2、Map转Json="+json);
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    List<Object> <->Json

    //3、List<Object> <->Json
                //准备数据
            List<Company> companyList = new ArrayList<Company>();
            companyList.add(getCompany());
            companyList.add(getCompany());
            companyList.add(getCompany());
    
                //List<Object>转Json
            json =  jm.toJson(companyList);
            logger.info("3.1、List<Object>转Json="+json);
    
                //Json转List<Object>
            List<Company> companyListDecode = jm.fromJson(json,new TypeReference<List<Company>>() {});
            logger.info("3.2、Json转List<Object>="+companyListDecode.get(0).getDepartmentArrayList().get(0).getName());
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    Map<String, Object><-> Json

    //4、Map<String, Object><-> Json
                //准备数据
            Map<String, Company> map1 = new HashMap<String, Company>() ;
            map1.put("1",getCompany());
            map1.put("2",getCompany());
            map1.put("3",getCompany());
    
                //Map<String, Object>转Json
            json =  jm.toJson(map1);
            logger.info("4.1、Map<String, Object>转Json="+json);
    
                //Json转Map<String, Object>
            Map<String, Company> map1Decode = jm.fromJson(json,new TypeReference<Map<String, Company>>() {});
            logger.info("4.2、Json转Map<String, Object>="+map1Decode.get("1").getDepartmentArrayList().get(0).getName());
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    List<Map<String, Object>><->Json

    //5、List<Map<String, Object>><->Json
                //准备数据
            List<Map<String, Company>> listMap =new ArrayList<Map<String, Company>>();
            Map<String, Company> map2 = new HashMap<String, Company>() ;
            map2.put("a",getCompany());
            map2.put("b",getCompany());
            map2.put("c",getCompany());
            listMap.add(map1);
            listMap.add(map2);
    
                //List<Map<String, Object>> 转Json
            json =  jm.toJson(listMap);
            logger.info("5.1、List<Map<String, Object>> 转Json="+json);
    
                //Json 转 List<Map<String, Object>>
            List<Map<String, Company>> listMapDecode = jm.fromJson(json,new TypeReference<List<Map<String, Company>>>() {});
            logger.info("5.2、List<Map<String, Object>> 转Json="+listMapDecode.get(0).get("1").getDepartmentArrayList().get(0).getName());
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    测试

    访问controller的方法,查看日志可以看出来每种转换都可以成功转为json,也可以成功转为对象

    其它特性

    在有些时候,我们会希望进行一些特殊处理,例如json不

    忽略字段

    @JsonIgnore 进行JSON操作时忽略该属性。
    对于实体类中,如果有某个字段不希望参与json序列化与反序列化,可以把属性标记为@JsonIgnore
    例如Company这个类
    如果我们给Name、Address、employeesCount三个属性赋值了,序列化出来的内容是

    {
        "name": "公司名1504688970821", 
        "address": "地址", 
        "employeesCount": 10
    }
    • 1
    • 2
    • 3
    • 4
    • 5

    如果employeesCount是一个内容计数的值,不希望参与序列化,我们可以标记它

        @JsonIgnore
        private  int employeesCount;
    • 1
    • 2

    这样再次序列化的结果就变为了

    {
        "name": "公司名1504689048950", 
        "address": "地址"
    }
    • 1
    • 2
    • 3
    • 4

    处理时间类型

    @JsonFormat(pattern = “yyyy年MM月dd日”) 时间格式化
    我们在Company实体类增加一个Date类型的属性,并且赋值序列化

    
        private Date createDate;
    
        public Date getCreateDate() {
            return createDate;
        }
    
        public void setCreateDate(Date createDate) {
            this.createDate = createDate;
        }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    赋值然后再序列化,得到的内容是

    {
        "name": "公司名1504689283756", 
        "address": "地址", 
        "createDate": 1504689283756
    }
    • 1
    • 2
    • 3
    • 4
    • 5

    可以看到时间是一个数字
    我们标记这个属性,再次序列化

    {
        "name": "公司名1504689362487", 
        "address": "地址", 
        "createDate": "2017年09月06日"
    }
    • 1
    • 2
    • 3
    • 4
    • 5

    时间按照指定的格式显示了

    更改字段序列化名

    @JsonProperty(“newName”) 改字段名
    默认情况下,字段名是什么,序列化出来的key值也就是什么,如果我们希望序列化出来的名字和字段名不一样,则需要使用这个标记
    我们把Company的name标记为newName

        @JsonProperty("newName")
        private  String name;
    • 1
    • 2

    然后进行序列化

    {
        "address": "地址", 
        "createDate": "2017年09月06日", 
        "newName": "公司名1504689496978"
    }
    • 1
    • 2
    • 3
    • 4
    • 5

    可以看出来,结果出来的key就使用了自定义的名字

  • 相关阅读:
    idea 将java导出为可执行jar及导入jar依赖
    使用idea 调试java -jar xxx.jar方式启动
    springboot 打成的jar包在ClassLoader().getResource方法读取文件为null
    maven 使用dependencyManagement统一管理依赖版本
    Win10系列:C#应用控件基础5
    Win10系列:C#应用控件基础4
    Win10系列:C#应用控件基础3
    Win10系列:C#应用控件基础2
    Win10系列:C#应用控件基础1
    Win10系列:UWP界面布局进阶9
  • 原文地址:https://www.cnblogs.com/hfultrastrong/p/8743462.html
Copyright © 2020-2023  润新知