Java中對象和JSON互相轉換的工具類


業務場景 

   工作中,經常出現:JSON 格式的字符串與 Java 對象互相轉換的情形。比如單點登陸,將“用戶信息”保存到 redis 時,Java 對象要轉成 JSON 字符串,從 redis 取出“用戶信息”后,要將 JSON 字符串轉成 Java 對象。使用MongoDB保存和讀取某些運算的結果集也是如此,因此,我們需要一個合適的輪子。

JSON有兩種格式,一種是對象,另一種是數組。大括號保存對象,中括號保存數組。

{"name":"JSON","address":"北京市西城區","age":25}//對象格式的字符串
[{"name":"JSON","address":"北京市西城區","age":25}]//數組格式的字符串

   從上面的兩種格式可以看出對象格式和數組對象格式唯一的不同則是在對象格式的基礎上加上了[]。再來看具體的結構,可以看出都是以鍵值對的形式出現的,多個鍵值對之間以英文狀態下的逗號(,)分隔。

引用 Maven 依賴

   我們需要在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 { // config //設置實體無屬性和json串屬性對應時不會出錯,只轉換對應的屬性
 MAPPER.disable(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES); // 忽略空bean轉 JSON 的錯誤
        MAPPER.configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS, false); } /** * 將對象轉換成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.isEmpty(jsonData) || null == beanType) { return null; } try { return MAPPER.readValue(jsonData, beanType); } catch (Exception e) { LOG.error(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.isEmpty(jsonData) || null == beanType) { return null; } JavaType javaType = MAPPER.getTypeFactory().constructParametricType(List.class, beanType); try { return MAPPER.readValue(jsonData, javaType); } catch (Exception e) { LOG.error(e); } return null; } }

測試用例 

   首先創建一個實體Student:

import lombok.Getter; import lombok.Setter; import lombok.ToString; import java.io.Serializable; import java.util.Date; /** * @author Wiener */ @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("JSON"); stu.setAge("23"); 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\":\"JSON\",\"age\":\"29\",\"address\":\"北京市朝陽區\",\"addressTest\":\"無對應屬性,不轉換\"}]"; List<Student> students = JsonUtils.jsonToList(arrayStr, Student.class); LOG.info("addressTest無對應屬性,不轉換。----- students = " + students); } public static void main(String[] args) { convertObject(); } }

   執行結果:

- ----- jsonStr = {"name":"JSON","age":"23","address":"北京市西城區","day":1573114596594} - stuPojo:Student(name=JSON, age=23, address=北京市西城區, day=Thu Nov 07 16:16:36 CST 2019) - addressTest無對應屬性,不轉換。----- students = [Student(name=JSON, age=29, address=北京市朝陽區, day=null)]

Reference

 https://www.cnblogs.com/ScarecrowAnBird/p/7804434.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM