解決使用json-lib包實(shí)現(xiàn)xml轉(zhuǎn)json時(shí)空值被轉(zhuǎn)為空中括號(hào)的問(wèn)題
項(xiàng)目數(shù)據(jù)庫(kù)中出現(xiàn)許多值為中括號(hào)[]的數(shù)據(jù),測(cè)試報(bào)了bug,經(jīng)過(guò)排查是因?yàn)槭褂昧薺son-lib 的jar包導(dǎo)致。json-lib在將xml字符串轉(zhuǎn)換為json格式的過(guò)程中,會(huì)將空值轉(zhuǎn)化了[],現(xiàn)在就簡(jiǎn)單的總結(jié)一下,兩種xml轉(zhuǎn)json包的異同??赡苁且?yàn)榇祟悊?wèn)題比較初級(jí),所以網(wǎng)上雖然有人提出此類問(wèn)題,但是沒(méi)有發(fā)現(xiàn)回答。為了方便像我一樣的初級(jí)程序員能盡快的發(fā)現(xiàn)和解決問(wèn)題,寫(xiě)了這篇博文。
網(wǎng)上能查到的xml轉(zhuǎn)json的jar包大部分是net.sf.json-lib,這個(gè)包在json解析方面應(yīng)用較多,但是缺點(diǎn)是需要的依賴包比較多。但是這里只講他xml轉(zhuǎn)json。
1、net.sf.json-lib 轉(zhuǎn)json;
JSON json =xmlSerializer.read(xml);
這個(gè)方法出現(xiàn)的問(wèn)題便是會(huì)將空值轉(zhuǎn)化為[],使用 json.get(value).getclass 獲取[]的類型可以發(fā)現(xiàn):json-lib將空值識(shí)別為了jsonarray類型而不是string,而jsonarray的tostring方法被重寫(xiě)為[,,,,]
如果依然要使用這個(gè)方法,可以做如下修改,在使用getString()方法獲取由xml轉(zhuǎn)化的json對(duì)象值時(shí),先判斷類型是是否為string再獲取。
json.get(value) instanceof String ? json.getString(value):""
2、org.json 轉(zhuǎn)json :
org.json.JSONObject jsonObj = org.json.XML.toJSONObject(xml);
不會(huì)生成[]值,但是會(huì)保留根標(biāo)簽(標(biāo)準(zhǔn)XML文檔有且只有一個(gè)根標(biāo)簽,所謂的根標(biāo)簽就是一對(duì)<根標(biāo)簽></根標(biāo)簽>包含其他全部標(biāo)簽),而一般根標(biāo)簽對(duì)數(shù)據(jù)而言是沒(méi)有意義的,所以你如果需要做處理的話
jsonObj.get("root");
下面是測(cè)試代碼:
package com.pptv.ppvision.util;
import org.json.XML;
import net.sf.json.JSONObject;
import net.sf.json.xml.XMLSerializer;
public class Xml2JsonTest {
private static String xml = "<root><user><name>weless</name><sex></sex></user></root>";
public static void main(String[] args) {
testOrgJSon();
testXmlSerializer();
}
public static void testOrgJSon(){
org.json.JSONObject jsonObj = XML.toJSONObject(xml);
System.out.println("org.json xml2json:"+jsonObj);
org.json.JSONObject user = jsonObj.getJSONObject("root").getJSONObject("user");//org.json需去除根標(biāo)簽
System.out.println("用戶名:"+user.getString("name"));
System.out.println("性別:"+user.getString("sex"));
}
public static void testXmlSerializer(){
XMLSerializer xmlSerializer = new XMLSerializer();
JSONObject jsonObject = (JSONObject)xmlSerializer.read(xml);
System.out.println("json-lib xml2json result: "+jsonObject);
JSONObject user = jsonObject.getJSONObject("user");
System.out.println("用戶名:"+user.get("name"));
System.out.println("性別:"+(user.get("sex") instanceof String ? user.getString("sex"):""));
}
}
這里為大家提供了兩種方法
一種是使用getString()方法獲取由xml轉(zhuǎn)化的json對(duì)象值時(shí),先判斷類型是是否為string再獲取
一種是org.json
大家可以根據(jù)自身需求選擇使用哪種方法
相關(guān)文章
如何解決springboot數(shù)據(jù)庫(kù)查詢時(shí)出現(xiàn)的時(shí)區(qū)差異問(wèn)題
這篇文章主要介紹了如何解決springboot數(shù)據(jù)庫(kù)查詢時(shí)出現(xiàn)的時(shí)區(qū)差異問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01
SpringBoot如何使用@Cacheable進(jìn)行緩存與取值
這篇文章主要介紹了SpringBoot如何使用@Cacheable進(jìn)行緩存與取值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08
SpringBoot項(xiàng)目接收前端參數(shù)的11種方式
在前后端項(xiàng)目交互中,前端傳遞的數(shù)據(jù)可以通過(guò)HTTP請(qǐng)求發(fā)送到后端, 后端在Spring Boot中如何接收各種復(fù)雜的前端數(shù)據(jù)呢?這篇文章總結(jié)了11種在Spring Boot中接收前端數(shù)據(jù)的方式,需要的朋友可以參考下2024-12-12
淺談Java 三種方式實(shí)現(xiàn)接口校驗(yàn)
這篇文章主要介紹了淺談Java 三種方式實(shí)現(xiàn)接口校驗(yàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10
基于Java實(shí)現(xiàn)楊輝三角 LeetCode Pascal''s Triangle
這篇文章主要介紹了基于Java實(shí)現(xiàn)楊輝三角 LeetCode Pascal's Triangle的相關(guān)資料,需要的朋友可以參考下2016-01-01
Springcloud基于OpenFeign實(shí)現(xiàn)服務(wù)調(diào)用代碼實(shí)例
這篇文章主要介紹了Springcloud基于OpenFeign實(shí)現(xiàn)服務(wù)調(diào)用代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08
spring?cloud中Feign導(dǎo)入jar失敗的問(wèn)題及解決方案
這篇文章主要介紹了spring?cloud中Feign導(dǎo)入jar失敗的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
JAVA如何獲取jvm和操作系統(tǒng)相關(guān)信息
這篇文章主要介紹了JAVA獲取jvm和操作系統(tǒng)相關(guān)信息,使用Java自帶的類進(jìn)行獲取系統(tǒng)運(yùn)行的相關(guān)信息,在這整理記錄分享一下,需要的朋友可以參考下2022-10-10

