最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Jackson中json格式的字符串與對象的互相轉(zhuǎn)換方式

 更新時間:2022年07月05日 14:21:24   作者:hestyle  
這篇文章主要介紹了Jackson中json格式的字符串與對象的互相轉(zhuǎn)換方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

json格式的字符串與對象的互相轉(zhuǎn)換

Jackson 簡介

Jackson是一個簡單基于Java應(yīng)用庫,Jackson可以輕松的將Java對象轉(zhuǎn)換成json字符串和xml文檔,同樣也可以將json、xml轉(zhuǎn)換成Java對象。Jackson所依賴的jar包較少,簡單易用并且性能也要相對高些,并且Jackson社區(qū)相對比較活躍,更新速度也比較快。

jackson特點(diǎn)

  • 容易使用 - jackson API提供了一個高層次外觀,以簡化常用的用例。
  • 無需創(chuàng)建映射 - API提供了默認(rèn)的映射大部分對象序列化。
  • 性能高 - 快速,低內(nèi)存占用,適合大型對象圖表或系統(tǒng)。
  • 干凈的JSON - jackson創(chuàng)建一個干凈和緊湊的JSON結(jié)果,這是讓人很容易閱讀。
  • 不依賴 - 庫不需要任何其他的庫,除了JDK。
  • 開源代碼 - jackson是開源的,可以免費(fèi)使用。

json格式的字符串與對象的轉(zhuǎn)換

使用Jackson必須要在項(xiàng)目導(dǎo)入對應(yīng)的jar包。

Book.java文件

package cn.hestyle.bean;
public class Book {
	private String id;
	private String name;
	private double price;
	private int pnum;
	private String category;
	private String description;
	
	public Book() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Book(String id, String name, double price, int pnum, String category, String description) {
		super();
		this.id = id;
		this.name = name;
		this.price = price;
		this.pnum = pnum;
		this.category = category;
		this.description = description;
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public double getPrice() {
		return price;
	}
	public void setPrice(double price) {
		this.price = price;
	}
	public int getPnum() {
		return pnum;
	}
	public void setPnum(int pnum) {
		this.pnum = pnum;
	}
	public String getCategory() {
		return category;
	}
	public void setCategory(String category) {
		this.category = category;
	}
	public String getDescription() {
		return description;
	}
	public void setDescription(String description) {
		this.description = description;
	}
	@Override
	public String toString() {
		return "Book [id=" + id + ", name=" + name + ", price=" + price + ", pnum=" + pnum + ", category=" + category
				+ ", description=" + description + "]";
	}
}
package cn.hestyle.utils;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
import cn.hestyle.bean.Book;
public class JacksonDemo01 {
	public static void main(String[] args) throws JsonGenerationException, JsonMappingException, IOException {
		ObjectMapper objectMapper = new ObjectMapper();
		//將對象轉(zhuǎn)換為json格式的字符串
		Book book = new Book("1001", "Java入門到入土", 99.9, 100, "編程開發(fā)", "你懂得!");
		String bookJsonStr = objectMapper.writeValueAsString(book);
		System.out.println(bookJsonStr);
		//將集合、數(shù)組對象轉(zhuǎn)換為json格式的字符串
		List<Book> bookList = new ArrayList<Book>();
		bookList.add(new Book("1001", "Java入門到入土", 99.9, 100, "編程開發(fā)", "你懂得!"));
		bookList.add(new Book("1002", "Python入門到入土", 89.9, 100, "編程開發(fā)", "你懂得!"));
		bookList.add(new Book("1003", "C++入門到入土", 89.9, 200, "編程開發(fā)", "你懂得!"));
		String bookListJsonStr = objectMapper.writeValueAsString(bookList);
		System.out.println(bookListJsonStr);
		
		//將json格式的字符串轉(zhuǎn)化為對象
		//字符串中含有雙引號,需要使用反斜杠轉(zhuǎn)義
		String bookString = "{\"id\":\"1001\",\"name\":\"Java入門到入土\",\"price\":99.9,\"pnum\":100}";
		//Book必須有無參的構(gòu)造方法
		Book book2 = objectMapper.readValue(bookString, Book.class);
		System.out.println(book2);
	}
}

控制臺輸出:

Jackson進(jìn)行json轉(zhuǎn)對象,對象轉(zhuǎn)json總結(jié)

在前后端分離的項(xiàng)目中,后端經(jīng)常涉及到j(luò)son與對象互轉(zhuǎn)的場景。阿里巴巴的Fastjson是好用,但是,因?yàn)榧夹g(shù)領(lǐng)導(dǎo)的原因(可能因?yàn)閒astjson1的各種問題很多吧),不讓用,所以就需要選擇其他技術(shù)棧。當(dāng)前比較常用的是SpringBoot自帶的Jackson或者谷歌的Gson。

下面,做一下使用Jackson的總結(jié)。

JavaBean準(zhǔn)備

1.Company,公司

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Company {
    private String companyName;
    private List<WebSite> webSites;
}

2.WebSite,站點(diǎn)

@Data
@NoArgsConstructor
@AllArgsConstructor
public class WebSite {
    private String webSiteName;
    private List<User> users;
}

3.User,用戶

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private String userId;
    private String username;
    private String password;
}

json字符串和對象互轉(zhuǎn)

對象轉(zhuǎn)json字符串

不管你是什么結(jié)構(gòu)的對象,想轉(zhuǎn)json,直接objectMapper.writeValueAsString()搞定。

    /**
     * 序列化:對象轉(zhuǎn)json字符串,包含多個數(shù)組
     *
     */
    @Test
    public void testObject2Json2() {
        User user2 = new User("1","上海辟謠專屬隊(duì)","職業(yè)辟謠,不信謠,不傳謠,呵呵");
        List<User> users = new ArrayList<>();
        users.add(user2);
        WebSite webSite = new WebSite();
        webSite.setWebSiteName("xxxxxx.com");
        webSite.setUsers(users);
        List<WebSite> webSites = new ArrayList<>();
        webSites.add(webSite);
        Company company = new Company();
        company.setCompanyName("yyyyyy");
        company.setWebSites(webSites);
        ObjectMapper objectMapper = new ObjectMapper();
        try {
            String jsonString = objectMapper.writeValueAsString(company);
            System.out.println(jsonString);
        } catch (JsonProcessingException e) {
            log.error("error: ", e);
        }
    }

輸出:

{"companyName":"yyyyyy","webSites":[{"webSiteName":"xxxxxx.com","users":[{"userId":"1","username":"上海辟謠專屬隊(duì)","password":"職業(yè)辟謠,不信謠,不傳謠,呵呵"}]}]}

json字符串轉(zhuǎn)對象

注意:這種情形是json對象字符串,不能是json數(shù)組字符串,后面會說到。

    @Test
    public void testJson2Object() {
        String json = "{\"companyName\":\"yyyyyy\",\"webSites\":[" +
                "{\"webSiteName\":\"xxxxxx.com\",\"users\":[{\"userId\":\"1\",\"username\":\"上海辟謠專屬隊(duì)\",\"password\":\"職業(yè)辟謠,不信謠,不傳謠,呵呵\"}]}" +
                "]}";
        ObjectMapper objectMapper = new ObjectMapper();
        try {
            Company company = objectMapper.readValue(json, Company.class);
            System.out.println(company.getWebSites().get(0).getUsers().get(0).getUsername());
        } catch (JsonProcessingException e) {
            log.error("error: ", e);
        }
    }

輸出:

上海辟謠專屬隊(duì)

json數(shù)組字符串和數(shù)組(集合)對象互轉(zhuǎn)

有個大坑

數(shù)組對象轉(zhuǎn)json數(shù)組字符串

    /**
     * 序列化:數(shù)組對象轉(zhuǎn)json數(shù)組類型的字符串
     *
     */
    @Test
    public void testObjectArray2JsonArrayString() {
        User user1 = new User("1","上海帶刀滬衛(wèi)","帶刀大佬");
        User user2 = new User("1","上海辟謠專屬隊(duì)","職業(yè)辟謠,不信謠,不傳謠,呵呵");
        List<User> users = new ArrayList<>();
        users.add(user1);
        users.add(user2);
        ObjectMapper objectMapper = new ObjectMapper();
        try {
            String json = objectMapper.writeValueAsString(users);
            System.out.println(json);
        } catch (JsonProcessingException e) {
            log.error("error: ", e);
        }
    }

輸出:

[{"userId":"1","username":"上海帶刀滬衛(wèi)","password":"帶刀大佬"},{"userId":"1","username":"上海辟謠專屬隊(duì)","password":"職業(yè)辟謠,不信謠,不傳謠,呵呵"}]

json數(shù)組字符串轉(zhuǎn)數(shù)組對象

先演示一下錯誤的寫法,先演示一下錯誤的寫法,先演示一下錯誤的寫法,重要的事情說三遍!

    /**
     * 反序列化:數(shù)組類型的json字符串轉(zhuǎn)對象數(shù)組
     *
     */
    @Test
    public void testJsonArrayString2ObjectArray() {
        String json = "[" +
                "{\"userId\":\"1\",\"username\":\"上海帶刀滬衛(wèi)\",\"password\":\"帶刀大佬\(zhòng)"}" +
                ",{\"userId\":\"1\",\"username\":\"上海辟謠專屬隊(duì)\",\"password\":\"職業(yè)辟謠,不信謠,不傳謠,呵呵\"}" +
                "]";
        ObjectMapper objectMapper = new ObjectMapper();
        try {
			//錯誤寫法
            List<User> list = objectMapper.readValue(json, List.class);
            list.forEach(user -> {
                System.out.println(user.getUsername());
            });
        } catch (JsonProcessingException e) {
            log.error("error: ", e);
        }
    }

輸出異常


java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.xywei.springboot.springtestdemo.entity.User

    at java.util.ArrayList.forEach(ArrayList.java:1259)
    at com.xywei.springboot.springtestdemo.junit.TestUseJackson.testJsonArrayString2ObjectArray(TestUseJackson.java:160)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:688)
    at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)
    at 

#省略大段……
Process finished with exit code -1

因?yàn)閷?shí)際轉(zhuǎn)成了map類型,所以使用List方式取值是錯的!

正確做法:

    /**
     * 反序列化:數(shù)組類型的json字符串轉(zhuǎn)對象數(shù)組
     *
     */
    @Test
    public void testJsonArrayString2ObjectArray() {
        String json = "[" +
                "{\"userId\":\"1\",\"username\":\"上海帶刀滬衛(wèi)\",\"password\":\"帶刀大佬\(zhòng)"}" +
                ",{\"userId\":\"1\",\"username\":\"上海辟謠專屬隊(duì)\",\"password\":\"職業(yè)辟謠,不信謠,不傳謠,呵呵\"}" +
                "]";
        ObjectMapper objectMapper = new ObjectMapper();
        try {
            TypeReference<List<User>> typeReference = new TypeReference<List<User>>() {
            };
            List<User> list = objectMapper.readValue(json, typeReference);
            list.forEach(user -> {
                System.out.println(user.getUsername());
            });
        } catch (JsonProcessingException e) {
            log.error("error: ", e);
        }
    }

最終輸出:

上海帶刀滬衛(wèi)

上海辟謠專屬隊(duì)

同時,對多層嵌套的數(shù)組也適用:

    @Test
    public void testJsonArrayString2ObjectArray2() {
        String json = "[" +
                    "{" +
                    "\"companyName\":\"yyyyyy\",\"webSites\":[" +
                            "{\"webSiteName\":\"xxxxxx.com\",\"users\":[" +
                                "{\"userId\":\"1\",\"username\":\"上海辟謠專屬隊(duì)\",\"password\":\"職業(yè)辟謠,不信謠,不傳謠,呵呵\"}" +
                                "]" +
                            "}" +
                        "]" +
                    "}" +
                "]";
        ObjectMapper objectMapper = new ObjectMapper();
        try {
            TypeReference<List<Company>> typeReference = new TypeReference<List<Company>>() {
            };
            List<Company> list = objectMapper.readValue(json, typeReference);
            list.forEach(company -> {
                System.out.println(company.getWebSites().get(0).getUsers().get(0).getUsername());
            });
        } catch (JsonProcessingException e) {
            log.error("error: ", e);
        }
    }

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java8?Stream流多字段求和、匯聚的實(shí)例

    Java8?Stream流多字段求和、匯聚的實(shí)例

    這篇文章主要介紹了Java8?Stream流多字段求和、匯聚的實(shí)例,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • IDEA 2020.2 +Gradle 6.6.1 + Spring Boot 2.3.4 創(chuàng)建多模塊項(xiàng)目的超詳細(xì)教程

    IDEA 2020.2 +Gradle 6.6.1 + Spring Boot 2.3.4 創(chuàng)建多模塊項(xiàng)目的超詳細(xì)教程

    這篇文章主要介紹了IDEA 2020.2 +Gradle 6.6.1 + Spring Boot 2.3.4 創(chuàng)建多模塊項(xiàng)目的教程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • 一文掌握SpringBoot多環(huán)境配置

    一文掌握SpringBoot多環(huán)境配置

    在實(shí)際項(xiàng)目的開發(fā)過程中,我們程序往往需要在不同環(huán)境中運(yùn)行,每個環(huán)境中的配置參數(shù)可能都會有所不同,例如數(shù)據(jù)庫連接信息、文件服務(wù)器等等,下面小編給大家介紹SpringBoot多環(huán)境配置,感興趣的朋友一起看看吧
    2024-04-04
  • 輕松掌握java責(zé)任鏈模式

    輕松掌握java責(zé)任鏈模式

    這篇文章主要幫助大家輕松掌握java責(zé)任鏈模式,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • Java生成二維碼的實(shí)例代碼

    Java生成二維碼的實(shí)例代碼

    這篇文章主要介紹了Java生成二維碼的實(shí)例代碼,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-09-09
  • Java實(shí)現(xiàn)短信驗(yàn)證碼的示例代碼

    Java實(shí)現(xiàn)短信驗(yàn)證碼的示例代碼

    Java是一種流行的編程語言,驗(yàn)證碼是一種常用的網(wǎng)絡(luò)安全技術(shù)。Java發(fā)展至今,網(wǎng)上也出現(xiàn)了各種各樣的驗(yàn)證碼,下面是用Java實(shí)現(xiàn)短信驗(yàn)證碼的總結(jié),感興趣的可以了解一下
    2023-03-03
  • 通過IEAD+Maven快速搭建SSM項(xiàng)目的過程(Spring + Spring MVC + Mybatis)

    通過IEAD+Maven快速搭建SSM項(xiàng)目的過程(Spring + Spring MVC + Mybatis)

    這篇文章主要介紹了通過IEAD+Maven快速搭建SSM項(xiàng)目的過程(Spring + Spring MVC + Mybatis),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • Java JVM內(nèi)存區(qū)域詳解

    Java JVM內(nèi)存區(qū)域詳解

    下面小編就為大家?guī)硪黄趈vm java內(nèi)存區(qū)域的介紹。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-11-11
  • springboot+mybatis如何屏蔽掉mybatis日志

    springboot+mybatis如何屏蔽掉mybatis日志

    這篇文章主要介紹了springboot+mybatis如何屏蔽掉mybatis日志問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • Spring用代碼來讀取properties文件實(shí)例解析

    Spring用代碼來讀取properties文件實(shí)例解析

    這篇文章主要介紹了Spring用代碼來讀取properties文件實(shí)例解析,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01

最新評論

石屏县| 手游| 定西市| 元氏县| 延吉市| 志丹县| 凭祥市| 武隆县| 晋州市| 金堂县| 兴仁县| 安泽县| 修水县| 大足县| 临西县| 思南县| 赤城县| 翼城县| 家居| 长春市| 乾安县| 万盛区| 华蓥市| 临桂县| 米易县| 绍兴县| 潞西市| 金沙县| 彰化县| 松溪县| 五大连池市| 融水| 铁岭市| 株洲县| 交城县| 延寿县| 平舆县| 竹溪县| 顺义区| 依兰县| 塔城市|