java中常用的json,jsonarray,map數(shù)據(jù)結(jié)構與對象互轉(zhuǎn)詳解
前言
創(chuàng)建一個對象
public class SbfpDto{
private int code;
private String message;
}
在Java開發(fā)中,對象與JSON、Map等數(shù)據(jù)結(jié)構的互轉(zhuǎn)是常見需求,下面涵蓋FastJSON和Jackson兩種常用庫的使用方法。
一、JSON字符串轉(zhuǎn)對象
1.FastJSON庫的正確用法
// 正確JSON字符串(注意英文引號)
String jsonStr = "{\"code\":2,\"message\":\"需要轉(zhuǎn)換的對象\"}";
// 方法1:直接解析(推薦)
SbfpDto sbfp1 = JSON.parseObject(jsonStr, SbfpDto.class);
// 方法2:通過JSONObject解析
SbfpDto sbfp2 = JSONObject.parseObject(jsonStr, SbfpDto.class);
//將JSON字符串解析為JSONObject對象
JSONObject js=JSONObject.parseObject(jsonStr);
錯誤修正:示例JSON.parseObject(JSON.toJSONString(jsonStr), SbfpDto .class)中 JSON.toJSONString(jsonStr) 會導致雙重轉(zhuǎn)義(如"{\"code\":2}"變成"\"{\\\"code\\\":2}\""),應直接解析原始字符串,即JSON.toJSONString 不應該對String類型進行轉(zhuǎn)換。
2.Jackson庫的用法
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.DeserializationFeature; // 創(chuàng)建ObjectMapper并配置忽略未知字段,設置未知列跳過 ObjectMapper mapper = new ObjectMapper(); mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); // 解析JSON SbfpDto sbfp = mapper.readValue(jsonStr, SbfpDto.class);
關鍵點:
FAIL_ON_UNKNOWN_PROPERTIES配置可避免JSON中有多余字段時拋異常。- 必須處理
IOException(需try-catch或聲明拋出)。
其他:BeanUtil.mapToBean();
二、JSON數(shù)組(JsonArray)轉(zhuǎn)對象列表
FastJSON優(yōu)化版
String jsonStr = "{\"sbfpList\":[{\"code\":2,\"message\":\"對象1\"},{\"code\":3,\"message\":\"對象2\"}]}";
// 一步到位解析(推薦)
List<SbfpDto> sbfps = JSON.parseObject(jsonStr)
.getJSONArray("sbfpList")
.toJavaList(SbfpDto.class);
//詳細步驟
JSONObject sfbpJson= JSON.parseObject(jsonStr);
JSONArray sbfpArray = sfbpJson.getJSONArray("sbfpList");
List<SbfpDto> sbfps= JSONArray.parseArray(sbfpArray.toJSONString(), SbfpDto.class);
//2 直接轉(zhuǎn)
String jsonStr2 = "[{\"code\":2,\"message\":\"對象1\"},{\"code\":3,\"message\":\"對象2\"}]";
List<SbfpDto> sbfps=JSONObject.parseArray(jsonstr2,SbfpDto.class);
List<SbfpDto> sbfps=JSON.parseArray(jsonstr2,SbfpDto.class);
優(yōu)化說明:無需手動轉(zhuǎn)換JSONArray到字符串再解析,直接使用toJavaList()方法更簡潔高效。
Jackson版
// 解析整個JSON
JsonNode root = mapper.readTree(jsonStr);
ArrayNode sbfpArray = (ArrayNode) root.get("sbfpList");
// 轉(zhuǎn)換為List
List<SbfpDto> sbfps = mapper.convertValue(sbfpArray, new TypeReference<List<SbfpDto>>() {});
三、對象轉(zhuǎn)Map
1. FastJSON實現(xiàn)
SbfpDto dto = new SbfpDto(2, "需要轉(zhuǎn)換的對象");
// 對象轉(zhuǎn)JSON字符串,再轉(zhuǎn)Map
Map<String, Object> map = JSON.parseObject(JSON.toJSONString(dto), new TypeReference<Map<String, Object>>() {});
//或者
Map<String,Object> map = JSON.parseObject(JSON.toJSONString(jsonStr),Map.class);
//將java對象序列化成JSON字符串
String jsonStr=JSON.toJSONString(dto);
注意:直接使用Map.class可能導致泛型類型丟失,推薦用TypeReference保留類型信息。
2. Jackson實現(xiàn)(更高效)
// 直接轉(zhuǎn)換對象為Map
Map<String, Object> map = mapper.convertValue(dto, new TypeReference<Map<String, Object>>() {});
其他:BeanUtil.beanTomap();
四、最佳實踐建議
庫的選擇:
- FastJSON:API簡潔,適合快速開發(fā),但需注意線程安全問題(
JSON類部分方法非線程安全)。 - Jackson:性能優(yōu)異,社區(qū)活躍,推薦用于復雜項目。
- BeanUtil:hutool中的該類也可以進行map和bean之間的轉(zhuǎn)換。
異常處理:
try {
SbfpDto dto = mapper.readValue(jsonStr, SbfpDto.class);
} catch (IOException e) {
// 處理解析失?。ㄈ缛罩居涗洝佔远x異常等)
}
日期格式等高級配置:
// Jackson配置日期格式
mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
避免中文引號:確保JSON字符串使用英文雙引號 ",而非 “”。
通過上述方法,您可以安全高效地實現(xiàn)對象與JSON、Map之間的轉(zhuǎn)換。根據(jù)項目需求選擇合適的庫,并注意配置和異常處理,可顯著提升代碼健壯性。
到此這篇關于java中常用的json,jsonarray,map數(shù)據(jù)結(jié)構與對象互轉(zhuǎn)詳解的文章就介紹到這了,更多相關java常用對象互轉(zhuǎn)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- Java中對象?和?json?互轉(zhuǎn)四種方式?json-lib、Gson、FastJson、Jackson
- java中json和對象之間相互轉(zhuǎn)換的運用
- JAVA中JSONObject對象和Map對象之間的相互轉(zhuǎn)換
- Java實現(xiàn)Json字符串與Object對象相互轉(zhuǎn)換的方式總結(jié)
- 詳談Java中net.sf.json包關于JSON與對象互轉(zhuǎn)的坑
- 基于JSON和java對象的互轉(zhuǎn)方法
- java對象與json對象間的相互轉(zhuǎn)換的方法
- java中實體類和JSON對象之間相互轉(zhuǎn)化
- Java中Json字符串和Java對象的互轉(zhuǎn)
相關文章
spring boot starter actuator(健康監(jiān)控)配置和使用教程
這篇文章主要介紹了spring-boot-starter-actuator(健康監(jiān)控)配置和使用教程,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2018-06-06
通過實例深入學習Java的Struts框架中的OGNL表達式使用
這篇文章主要通過實例介紹了Java的Strus框架中的OGNL表達式使用,Struts框架是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下2015-11-11
Spring Security整合Oauth2實現(xiàn)流程詳解
這篇文章主要介紹了Spring Security整合Oauth2實現(xiàn)流程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-08-08

