java与json相互转化_Jackson_Gson_Fastjson

日志概述

在日常实践中通常会对JSON数据和Java对象进行相互转换,转换需要用到JSON解析器,常见的解析器如下:

  • Jsonlib(JSON官方)
  • Gson(Google)
  • Jackson(Spring官方)
  • Fastjson(Alibaba)

作为 Spring MVC / SpringBoot 技术栈 开发的话,用默认的Jackson是最好的!

数据量少时:Gson快

数据量多时:FastJson快

数据量无论多少:Jackson最稳定

Jackson

SpringBoot2 中的 web starter 中就内置了 jackson 三个jar依赖

Maven构建地址 | Github地址

目前最新版为 2.12.3 其中三个jar 各自大小为

  1. jackson-core 314Kb
  2. jackson-databind 1.3Mb
  3. jackson-annotations 65Kb

快速入门

引入依赖

pom.xml

springboot\springmvc内置,不需要在引入

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.12.3</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.12.3</version>
</dependency>
<!-- 注意:如没有用到注解去配置,可不用引入此依赖 -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.12.3</version>
</dependency>

代码测试

Java代码:

package com.demo;

import com.demo.entity.User;
import com.demo.mapper.UserMapper;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@SpringBootTest
class SpringbootalinbabaSsmStart01ApplicationTests {
    
    
    private static final Logger LOGGER = LoggerFactory.getLogger(SpringbootalinbabaSsmStart01ApplicationTests.class);
    @Autowired
    private UserMapper userMapper;

    @Test
    public void test1() {
    
    
        List<User> userList = userMapper.queryAllUser();
        for (User user : userList) {
    
    
            LOGGER.info("数据为:{}", user);
        }
    }

    @Test
    public void test2() throws IOException {
    
    
        //创建对象
        User user = new User();
        user.setId(0L);
        user.setUsername("张三");
        user.setEmail("[email protected]");
        user.setPassword("123");
        user.setPhoneNum("456");
        User[] users = {
    
    user,new User(2L,"李四","邮箱","密码","电话")};
        ArrayList<String> list = new ArrayList<>();
        list.add("苹果");
        list.add("橘子");
        HashMap<String, Object> map = new HashMap<>();
        map.put("name", "张三");
        map.put("age", 20);


        //创建jackson的核心对象
        ObjectMapper objectMapper = new ObjectMapper();

        //java对象(包括list、map)转json字符串
        String pStr1 = objectMapper.writeValueAsString(user);
        String pStr2 = objectMapper.writeValueAsString(list);
        String pStr3 = objectMapper.writeValueAsString(map);
        String pStr4 = objectMapper.writeValueAsString(users);
        LOGGER.info("bean=》json:{}",pStr1);
        LOGGER.info("list=》json:{}",pStr2);
        LOGGER.info("map=》json:{}",pStr3);
        LOGGER.info("beans=》jsons:{}",pStr4);


        //json字符串转java对象:
        String json = "{\"id\":0,\"username\":\"张三\",\"email\":\"[email protected]\",\"password\":\"123\",\"phoneNum\":\"456\"}";
        User bean = new ObjectMapper().readValue(json, User.class);
        LOGGER.info("json =》bean:{},username ={}",bean,bean.getUsername());


        //json字符串转list对象:TypeReference匿名内部类,指明对象类型
        String json2 = "[\"苹果\",\"橘子\"]";
        List<String> beanList = new ObjectMapper().readValue(json2, new TypeReference<List<String>>() {
    
    });
        LOGGER.info("list =》bean:{}",beanList);

        //json字符串转map对象:
        String json3 ="{\"name\":\"张三\",\"age\":20}";
        Map<String,Object> beanMap = new ObjectMapper().readValue(json3, new TypeReference<HashMap<String,Object>>(){
    
    });
        LOGGER.info("map =》bean:{}",beanMap);

        //JSON数组字符串->对象数组
        String json4 = "[{\"id\":0,\"username\":\"张三\",\"email\":\"[email protected]\",\"password\":\"123\",\"phoneNum\":\"456\"},{\"id\":2,\"username\":\"李四\",\"email\":\"邮箱\",\"password\":\"密码\",\"phoneNum\":\"电话\"}]";
        User[] cars2 = objectMapper.readValue(json4, User[].class);
        LOGGER.info("jsons =》beans:{}",beanMap);


    }
}

打印如下

2023-05-30 01:03:54.842  INFO 14444 --- [           main] ngbootalinbabaSsmStart01ApplicationTests : bean=》json:{
    
    "id":0,"username":"张三","email":"[email protected]","password":"123","phoneNum":"456"}
2023-05-30 01:03:54.842  INFO 14444 --- [           main] ngbootalinbabaSsmStart01ApplicationTests : list=》json:["苹果","橘子"]
2023-05-30 01:03:54.842  INFO 14444 --- [           main] ngbootalinbabaSsmStart01ApplicationTests : map=》json:{
    
    "name":"张三","age":20}
2023-05-30 01:03:54.842  INFO 14444 --- [           main] ngbootalinbabaSsmStart01ApplicationTests : beans=》jsons:[{
    
    "id":0,"username":"张三","email":"[email protected]","password":"123","phoneNum":"456"},{
    
    "id":2,"username":"李四","email":"邮箱","password":"密码","phoneNum":"电话"}]
2023-05-30 01:03:54.866  INFO 14444 --- [           main] ngbootalinbabaSsmStart01ApplicationTests : json =》bean:User(id=0, username=张三, email=123@qq.com, password=123, phoneNum=456),username =张三
2023-05-30 01:03:54.866  INFO 14444 --- [           main] ngbootalinbabaSsmStart01ApplicationTests : list =》bean:[苹果, 橘子]
2023-05-30 01:03:54.872  INFO 14444 --- [           main] ngbootalinbabaSsmStart01ApplicationTests : map =》bean:{
    
    name=张三, age=20}
2023-05-30 01:03:54.872  INFO 14444 --- [           main] ngbootalinbabaSsmStart01ApplicationTests : jsons =》beans:{
    
    name=张三, age=20}

Java对象转JSON相关注解

@JsonIgnore:排除属性。
@JsonFormat:属性值得格式化

  • @JsonFormat(pattern = “yyyy-MM-dd”)

Person类

package com.demo.entity;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Person {
    
    
    private Integer id;
    private String name;
    @JsonIgnore
    private Integer age;
    @JsonIgnore
    private String addr;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date birthday;
}

测试方法

@Test
public void test3() throws Exception {
    
    
    Person person = new Person();
    person.setId(20);
    person.setName("Tom");
    person.setAge(23);
    person.setAddr("QD");
    person.setBirthday(new Date());

    ObjectMapper objectMapper = new ObjectMapper();
    String s = objectMapper.writeValueAsString(person);

    System.out.println(s); // {"id":20,"name":"Tom","birthday":"2023-05-29 17:07:35"}
}

Fastjson使用(Alibaba)

Maven构件地址 | Github地址

目前最新版本为 1.2.76 jar包大小为 533kb

阿里出品的json库,解析速度非常快。但是被曝出过漏洞问题,使用最新版的就好。

快速入门

引入依赖

pom.xml

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

代码测试

package com.demo;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.demo.entity.User;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@SpringBootTest
class Test02 {
    
    
    private static final Logger LOGGER = LoggerFactory.getLogger(Test02.class);

    @Test
    public void test6() {
    
    
        //创建对象
        User user = new User();
        user.setId(0L);
        user.setUsername("张三");
        user.setEmail("[email protected]");
        user.setPassword("123");
        user.setPhoneNum("456");
        User[] users = {
    
    user,new User(2L,"李四","邮箱","密码","电话")};
        ArrayList<String> list = new ArrayList<>();
        list.add("苹果");
        list.add("橘子");
        HashMap<String, Object> map = new HashMap<>();
        map.put("name", "张三");
        map.put("age", 20);


        //java对象(包括list、map)转json字符串
        String pStr1 = JSON.toJSONString(user);
        String pStr2 = JSON.toJSONString(list);
        String pStr3 = JSON.toJSONString(map);
        String pStr4 = JSON.toJSONString(users);
        System.out.println("bean=》json:"+pStr1);
        System.out.println("list=》json:"+pStr2);
        System.out.println("map=》json:"+pStr3);
        System.out.println("beans=》jsons:"+pStr4);



        //json字符串转java对象:
        User bean= JSONObject.parseObject("{\"username\":\"张三\"}", User.class);
        System.out.println(bean);
        //json字符串转list对象:
        List<String> beanList =JSONObject.parseArray("[\"苹果\",\"橘子\"]", String.class);
        System.out.println(beanList);
        //json字符串转map对象:
        Map<String,Object> beanMap = ( Map<String,Object> )JSONObject.parse("{\"name\":\"张三\",\"age\":20}");
        System.out.println(beanMap);
    }


}
bean=》json:{"email":"[email protected]","id":0,"password":"123","phoneNum":"456","username":"张三"}
list=》json:["苹果","橘子"]
map=》json:{"name":"张三","age":20}
beans=》jsons:[{"email":"[email protected]","id":0,"password":"123","phoneNum":"456","username":"张三"},{"email":"邮箱","id":2,"password":"密码","phoneNum":"电话","username":"李四"}]
User(id=null, username=张三, email=null, password=null, phoneNum=null)
[苹果, 橘子]
{"name":"张三","age":20}
2023-05-30 01:24:15.688  INFO 13616 --- [ionShutdownHook] com.alibaba.druid.pool.DruidDataSource   : {dataSource-1} closing ...
2023-05-30 01:24:15.688  INFO 13616 --- [ionShutdownHook] com.alibaba.druid.pool.DruidDataSource   : {dataSource-1} closed
Disconnected from the target VM, address: '127.0.0.1:14228', transport: 'socket'

Gson

功能最全的json解析器,google谷歌出品

Maven构件地址 | Github地址

目前最新版为 2.8.6 其jar大小为 235kb

快速入门

引入依赖

	<dependency>
		<groupId>com.google.code.gson</groupId>
		<artifactId>gson</artifactId>
		<version>2.8.6</version>
	</dependency>

代码测试

package com.demo;

import com.demo.entity.User;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@SpringBootTest
class Test03 {
    
    
    private static final Logger LOGGER = LoggerFactory.getLogger(Test03.class);

    @Test
    public void test6() {
    
    
        //创建对象
        User user = new User();
        user.setId(0L);
        user.setUsername("张三");
        user.setEmail("[email protected]");
        user.setPassword("123");
        user.setPhoneNum("456");
        User[] users = {
    
    user,new User(2L,"李四","邮箱","密码","电话")};
        ArrayList<String> list = new ArrayList<>();
        list.add("苹果");
        list.add("橘子");
        HashMap<String, Object> map = new HashMap<>();
        map.put("name", "张三");
        map.put("age", 20);


        //java对象(包括list、map)转json字符串
        String pStr1 = new Gson().toJson(user);
        String pStr2 = new Gson().toJson(list);
        String pStr3 = new Gson().toJson(map);
        String pStr4 = new Gson().toJson(users);
        System.out.println("bean=》json:"+pStr1);
        System.out.println("list=》json:"+pStr2);
        System.out.println("map=》json:"+pStr3);
        System.out.println("beans=》jsons:"+pStr4);



        //json字符串转java对象:
        User bean= new Gson().fromJson("{\"username\":\"张三\"}", User.class);
        System.out.println(bean);
        //json字符串转list对象:
        List<String> beanList =new Gson().fromJson("[\"苹果\",\"橘子\"]", new TypeToken<List<String>>(){
    
    }.getType());
        System.out.println(beanList);
        //json字符串转map对象:
        Map<String,Object> beanMap = new Gson().fromJson("{\"name\":\"张三\",\"age\":20}", new TypeToken<HashMap<String,Object>>(){
    
    }.getType());
        System.out.println(beanMap);
    }


}
list=》json:["苹果","橘子"]
map=》json:{"name":"张三","age":20}
beans=》jsons:[{"id":0,"username":"张三","email":"[email protected]","password":"123","phoneNum":"456"},{"id":2,"username":"李四","email":"邮箱","password":"密码","phoneNum":"电话"}]
User(id=null, username=张三, email=null, password=null, phoneNum=null)
[苹果, 橘子]
{name=张三, age=20.0}

猜你喜欢

转载自blog.csdn.net/weixin_44797182/article/details/130967241