一文帮你完美解决Json和Xml相互转换
生活随笔
收集整理的這篇文章主要介紹了
一文帮你完美解决Json和Xml相互转换
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
1、導入用到的jar包
2、xml格式轉換為json格式
3、json格式轉換為xml格式
我們經常會碰到Json和Xml相互轉換,但是轉換過程中經常出現各種奇葩問題,比如多節點了或少節點了,或者轉換后的格式不對,多了空數組,還有就是遇到帶屬性的xml格式轉換完之后屬性沒了等等,今天就手把手教你完美解決這些坑。上代碼
1、導入用到的jar包
<dependency><groupId>net.sf.json-lib</groupId><artifactId>json-lib</artifactId><version>2.4</version><!-- 加入jdk15,不然jar包下載不下來 --><classifier>jdk15</classifier> </dependency> <dependency><groupId>xom</groupId><artifactId>xom</artifactId><version>1.2.5</version><type>jar</type><scope>compile</scope> </dependency><!-- json 轉xml用 --> <dependency><groupId>org.dom4j</groupId><artifactId>dom4j</artifactId><version>2.0.0</version> </dependency>2.1、xml格式轉換為json格式
會丟失節點,如以下列子會丟student節點,但是如果xml存在屬性節點,該方法不會丟失,會轉換為@+屬性名稱
public static void main(String[] args) {String dest="";String result="<?xml version="1.0" encoding="UTF-8"?><class><name>實驗1班</name><no>2020</no><students><student><name>張三</name><sex>女</sex></student><student><name>李四</name><sex>男</sex></student></students></class> " ;if (result != null) {Pattern p = Pattern.compile("\\s{3,}|\t|\r|\n");//去掉多余的空格(跳過開頭<?xml version="1.0" encoding="UTF-8"/>中的空格)Matcher m = p.matcher(result);dest = m.replaceAll("");System.out.println(dest);}//將xml轉為json(注:如果是元素的屬性,會在json里的key前加一個@標識)XMLSerializer xmlSerializer = new XMLSerializer();//將輸出的[]轉換為""String json = xmlSerializer.read(dest).toString().replace("[]", "\"\"");System.out.println(json);//{"name":"實驗1班","no":"2020","students":[{"name":"張三","sex":"女"},{"name":"李四","sex":"男"}]} }最終的結果為
{"name": "實驗1班","no": "2020","students": [{"name": "張三","sex": "女"},{"name": "李四","sex": "男"}] }2.2 xml 轉json格式(不會丟失節點)
該方法是先將xml轉換為map,再轉為json,但是該方法會丟失xml的屬性節點。
import net.sf.json.JSONObject; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.DocumentHelper; import org.dom4j.Element;import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern;public class XmlToJson {public static void main(String[] args) {String dest="";String xmlStr="<?xml version=\"1.0\" encoding=\"UTF-8\"?><class><name>實驗1班</name><no>2020</no><students><student><name>張三</name><sex>女</sex></student><student><name>李四</name><sex>男</sex></student></students></class>" ;if (!"".equals(xmlStr)) {Pattern p = Pattern.compile("\\s{3,}|\t|\r|\n");//去掉多余的空格和換行(跳過開頭<?xml version="1.0" encoding="UTF-8"/>中的空格)Matcher m = p.matcher(xmlStr);dest = m.replaceAll("");}Map<String, Object> stringObjectMap = Xml2Map(dest);JSONObject jsonObject = (JSONObject) JSONObject.fromObject(stringObjectMap);System.out.println(jsonObject);//{"no":"2020","name":"實驗1班","students":{"student":[{"sex":"女","name":"張三"},{"sex":"男","name":"李四"}]}}}public static Map<String, Object> Xml2Map(String result) {Document doc = null;try {doc = DocumentHelper.parseText(result);} catch (DocumentException e) {e.printStackTrace();}Map<String, Object> map = new HashMap<String, Object>();if (result == null) {return map;}Element root = doc.getRootElement();for (Iterator iterator = root.elementIterator(); iterator.hasNext();) {Element e = (Element) iterator.next();List list = e.elements();if (list.size() > 0) {map.put(e.getName(), Element2Map(e));} elsemap.put(e.getName(), e.getText());}return map;}public static Map Element2Map(Element e) {Map map = new HashMap();List list = e.elements();if (list.size() > 0) {for (int i = 0; i < list.size(); i++) {Element iter = (Element) list.get(i);List mapList = new ArrayList();if (iter.elements().size() > 0) {Map m = Element2Map(iter);if (map.get(iter.getName()) != null) {Object obj = map.get(iter.getName());if (!obj.getClass().getName().equals("java.util.ArrayList")) {mapList = new ArrayList();mapList.add(obj);mapList.add(m);}if (obj.getClass().getName().equals("java.util.ArrayList")) {mapList = (List) obj;mapList.add(m);}map.put(iter.getName(), mapList);} elsemap.put(iter.getName(), m);} else {if (map.get(iter.getName()) != null) {Object obj = map.get(iter.getName());if (!obj.getClass().getName().equals("java.util.ArrayList")) {mapList = new ArrayList();mapList.add(obj);mapList.add(iter.getText());}if (obj.getClass().getName().equals("java.util.ArrayList")) {mapList = (List) obj;mapList.add(iter.getText());}map.put(iter.getName(), mapList);} elsemap.put(iter.getName(), iter.getText());}}} elsemap.put(e.getName(), e.getText());return map;} }轉換結果符合要求,沒有丟失節點
{"no": "2020","name": "實驗1班","students": {"student": [{"sex": "女","name": "張三"},{"sex": "男","name": "李四"}]} }?
3、json格式轉換為xml格式
假設我們要把剛才轉出的json轉換為xml
public static void main(String[] args) {String jsonStr = "{"name":"實驗1班","no":"2020","students":[{"name":"張三","sex":"女"},{"name":"李四","sex":"男"}]}";String xmlStr = json2XmlString(jsonStr,"class");System.out.println(xmlStr);//<?xml version="1.0" encoding="utf-8"?><class><name>實驗1班</name><no>2020</no><students><name>張三</name><sex>女</sex><name>李四</name><sex>男</sex></students></class>}/** * * @param jsonStr json字符串 * @param rootName xml 最外層節點名稱,如<class></class> * @return */ public static String json2XmlString(String jsonStr,String rootName){StringBuffer sb = new StringBuffer();String xmlStr = "";JSONObject json = JSONObject.fromObject(jsonStr);XMLSerializer xmlSerializer = new XMLSerializer();xmlSerializer.setRootName(rootName);xmlSerializer.setTypeHintsEnabled(false);String xml = xmlSerializer.write(json);xml = xml.replace("<o>", "").replace("</o>", "");xml = xml.replace("<e>", "").replace("</e>", "");xml = xml.replaceAll("\r\n", "").concat("\r\n");Document document;try {document = DocumentHelper.parseText(xml);xmlStr = document.getRootElement().asXML();} catch (DocumentException e) {e.printStackTrace();}sb.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>").append(xmlStr);return sb.toString(); }有問題歡迎加群討論:700637673
總結
以上是生活随笔為你收集整理的一文帮你完美解决Json和Xml相互转换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: css3 图片裁剪菱形,利用CSS3 c
- 下一篇: Aspen中物性方法选择