Java中对象和JSON如何互相转换呢?

乔欣 Java经验 发布时间:2023-02-17 16:48:14 阅读数:18206 1
下文笔者讲述使用java代码对对象和JSON之间互相转换的方法分享,如下所示

JSON和对象的互相转换的实现思路

实现思路:
    使用jackson中的json工具类
	即可实现JSON和对象之间的互相转换

JSON常见格式说明

JSON数据格式分为:
    1.对象
	    {"name":"猫猫","address":"深圳","age":18}//对象格式的字符串
	  对应java中的对象
	2.数组
	   [{"name":"猫猫","address":"深圳","age":18}]//数组格式的字符串
	   对应java中的list<Entity>

JSON工具类创建

引入maven依赖
<dependency>
		<groupId>org.codehaus.jackson</groupId>
		<artifactId>jackson-core-asl</artifactId>
		<version>1.9.12</version>
	</dependency>
	<dependency>
		<groupId>org.codehaus.jackson</groupId>
		<artifactId>jackson-mapper-asl</artifactId>
		<version>1.9.12</version>
	</dependency>
	<dependency>
		<groupId>log4j</groupId>
		<artifactId>log4j</artifactId>
		<version>1.2.17</version>
	</dependency>
	<dependency>
		<groupId>org.slf4j</groupId>
		<artifactId>slf4j-api</artifactId>
		<version>1.7.25</version>
	</dependency>
	<dependency>
		<groupId>org.slf4j</groupId>
		<artifactId>slf4j-log4j12</artifactId>
		<version>1.7.25</version>
		<scope>test</scope>
	</dependency>
	<dependency>
		<groupId>org.slf4j</groupId>
		<artifactId>slf4j-simple</artifactId>
		<version>1.7.25</version>
		<scope>test</scope>
	</dependency>
	<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
	<dependency>
		<groupId>org.projectlombok</groupId>
		<artifactId>lombok</artifactId>
		<version>1.18.10</version>
		<scope>provided</scope>
	</dependency>

编写工具类

import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import org.codehaus.jackson.map.DeserializationConfig;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.SerializationConfig;
import org.codehaus.jackson.type.JavaType;

import java.io.IOException;
import java.util.List;

public class JsonUtils {

    private static final Logger LOG = Logger.getLogger(JsonUtils.class);

    // 定义jackson对象,用于 Java 对象的序列化及反序列化
    private static final ObjectMapper MAPPER = new ObjectMapper();

    static {
        //设置实体无属性和json串属性对应时不会出错,只转换对应的属性
        MAPPER.disable(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES);
        //忽略值为null的属性
        MAPPER.setSerializationInclusion(JsonInclude.Include.NON_NULL);
    }

    /**
     * 将对象转换成json字符串。
     * <p>Title: pojoToJson</p>
     * <p>Description: </p>
     *
     * @param data
     * @return
     */
    public static String objectToJson(Object data) {
        try {
            return MAPPER.writeValueAsString(data);
        } catch (JsonMappingException e) {
            LOG.error(e);
        } catch (IOException e) {
            LOG.error(e);
        }
        return null;
    }

    /**
     * 将json结果集转化为对象
     *
     * @param jsonData json数据
     * @param beanType 对象中的object类型,<T> 将此方法声明为泛型方法,可传入任何对象
     * @return <T> 目标对象
     */
    public static <T> T jsonToPojo(String jsonData, Class<T> beanType) {
        if (StringUtils.isBlank(jsonData) || null == beanType) {
            return null;
        }
        try {
            return MAPPER.readValue(jsonData, beanType);
        } catch (Exception e) {
            LOG.error("json字符串转对象失败,json = {},clazz = {}", jsonData, beanType, e);
        }
        return null;
    }

    /**
     * 将json数据转换成pojo对象list
     * <p>Title: jsonToList</p>
     * <p>Description: </p>
     *
     * @param jsonData
     * @param beanType
     * @return
     */
    public static <T> List<T> jsonToList(String jsonData, Class<T> beanType) {
        if (StringUtils.isBlank(jsonData) || null == beanType) {
            return null;
        }
        JavaType javaType = MAPPER.getTypeFactory().constructParametricType(List.class, beanType);
        try {
            return MAPPER.readValue(jsonData, javaType);
        } catch (Exception e) {
            LOG.error("json字符串转List失败,json = {},clazz = {}", jsonData, beanType, e);
        }
        return null;
    }
}

定义实体User

 
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

import java.io.Serializable;
import java.util.Date;

@Getter
@Setter
@ToString
public class Student implements Serializable {

   private static final long serialVersionUID = -5246589941647210011L;
    //姓名
    private String name;
    //年龄
    private String age;
    //住址
    private String address;
   private Date day;
}

编写测试代码

import org.apache.log4j.Logger;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class JsonTest {
    private static final Logger LOG = Logger.getLogger(JsonTest.class);

    public static void convertObject() {
        Student stu=new Student();
        stu.setName("猫猫");
        stu.setAge("18");
        stu.setDay(new Date());
        stu.setAddress("深圳");
        //1、使用JSONObject
         String jsonStr = JsonUtils.objectToJson(stu);
       LOG.info("----- jsonStr = " + jsonStr);

        //2、使用JSONArray
         Student stuPojo = JsonUtils.jsonToPojo(jsonStr, Student.class);
        LOG.info("stuPojo:" + stuPojo.toString());
        List<Student> studentList = new ArrayList<>();
        studentList.add(stu);

        String arrayStr="[{\"name\":\"猫猫\",\"age\":\"18\",\"address\":\"深圳\",\"addressTest\":\"无对应属性,不转换\"}]";
        List<Student> students = JsonUtils.jsonToList(arrayStr, Student.class);
        LOG.info("addressTest无对应属性,不转换。----- students = " + students);
    }


    public static void main(String[] args) {
        convertObject();
    }

}

-----运行以上代码,将输出以下信息-----
- ----- jsonStr = {"name":"猫猫","age":"18","address":"深圳","day":***}
- stuPojo:Student(name=猫猫, age=18, address=深圳, day=**)
- addressTest无对应属性,不转换。----- students = [Student(name=猫猫, age=18, address=深圳, day=null)]
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaJingYan/202302/16766237285825.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者