java實現xml互轉json
阿新 • • 發佈:2022-05-05
轉載自:https://www.jianshu.com/p/e341c12449d2
自己debug跟原始碼,主要解決其中json轉xml遇到的一些問題
1. 依賴引入
1 <dependency> 2 <groupId>net.sf.json-lib</groupId> 3 <artifactId>json-lib</artifactId> 4 <version>2.4</version> 5 <classifier>jdk15</classifier> 6</dependency> 7 8 <dependency> 9 <groupId>xom</groupId> 10 <artifactId>xom</artifactId> 11 <version>1.2.5</version> 12 </dependency>
2. Xml 2Json案例
1 <?xml version="1.0" encoding="utf-8"?> 2 <Mk_Main_Info Mk_Id="本地系統中的 ID" Mk_Remarke="" Mk_Table="單位名稱" Mk_Version="Ver 3.00.0001"> 3<Mk_Item Mk_Row="行號"> 4 <Mk_Item_Data Mk_Field="fg_dwbm"> 5 <Mk_Data>系統中編碼[連線資料時提供]</Mk_Data> 6 </Mk_Item_Data> 7 <Mk_Item_Data Mk_Field="fg_dwbc"> 8 <Mk_Data>系統中編碼[連線資料時提供]</Mk_Data> 9 </Mk_Item_Data> 10</Mk_Item> 11 </Mk_Main_Info>
1 public static void main(String[] args) { 2 String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?><Mk_Main_Info Mk_Id=\"本地系統中的 ID\" Mk_Version=\"Ver 3.00.0001\" Mk_Table=\"單位名稱\" Mk_Remarke=\"\">\n" + "\t\t<Mk_Item Mk_Row=\"行號\">\n" + "\t\t\t<Mk_Item_Data Mk_Field=\"fg_dwbm\">\n" + "\t\t\t\t<Mk_Data>系統中編碼[連線資料時提供]</Mk_Data>\n" + "\t\t\t</Mk_Item_Data>\n" + "\t\t\t<Mk_Item_Data Mk_Field=\"fg_dwbc\">\n" + "\t\t\t\t<Mk_Data>系統中編碼[連線資料時提供]</Mk_Data>\n" + "\t\t\t</Mk_Item_Data>\n" + "\t\t</Mk_Item>\n" + "\t</Mk_Main_Info>"; 3 System.out.println("==========xml to json================"); 4 XMLSerializer xmlSerializer = new XMLSerializer(); 5 // TODO 注意:預設false:不輸出根元素, true為輸出根元素 6 xmlSerializer.setForceTopLevelObject(true); 7 JSON read = xmlSerializer.read(xml); 8 String jsonStr = read.toString(); 9 // jsonStr.replace("[]", "\"\""); 10 System.out.println(jsonStr); 11 }
1 { 2 "Mk_Main_Info": { 3 "@Mk_Id": "本地系統中的 ID", 4 "@Mk_Version": "Ver 3.00.0001", 5 "@Mk_Table": "單位名稱", 6 "@Mk_Remarke": "", 7 "Mk_Item": { 8 "@Mk_Row": "行號", 9 "Mk_Item_Data": [ 10 { 11 "@Mk_Field": "fg_dwbm", 12 "Mk_Data": "系統中編碼[連線資料時提供]" 13 }, 14 { 15 "@Mk_Field": "fg_dwbc", 16 "Mk_Data": "系統中編碼[連線資料時提供]" 17 } 18 ] 19 } 20 } 21 }
- Json2Xml
直接根據上面的輸出結果
1 public static void main(String[] args) { 2 String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?><Mk_Main_Info Mk_Id=\"本地系統中的 ID\" Mk_Version=\"Ver 3.00.0001\" Mk_Table=\"單位名稱\" Mk_Remarke=\"\">\n" + "\t\t<Mk_Item Mk_Row=\"行號\">\n" + "\t\t\t<Mk_Item_Data Mk_Field=\"fg_dwbm\">\n" + "\t\t\t\t<Mk_Data>系統中編碼[連線資料時提供]</Mk_Data>\n" + "\t\t\t</Mk_Item_Data>\n" + "\t\t\t<Mk_Item_Data Mk_Field=\"fg_dwbc\">\n" + "\t\t\t\t<Mk_Data>系統中編碼[連線資料時提供]</Mk_Data>\n" + "\t\t\t</Mk_Item_Data>\n" + "\t\t</Mk_Item>\n" + "\t</Mk_Main_Info>"; 3 System.out.println("==========xml to json================"); 4 XMLSerializer xmlSerializer = new XMLSerializer(); 5 // 預設false:不輸出根元素, true為輸出根元素 6 xmlSerializer.setForceTopLevelObject(true); 7 JSON read = xmlSerializer.read(xml); 8 String jsonStr = read.toString(); 9 // jsonStr.replace("[]", "\"\""); 10 System.out.println(jsonStr); 11 System.out.println("==========json to xml================"); 12 String write = xmlSerializer.write(JSONSerializer.toJSON(jsonStr), "gbk"); 13 System.out.println(write); 14 }
1 <?xml version="1.0" encoding="gbk"?> 2 <o> 3 <Mk_Main_Info class="object" Mk_Id="本地系統中的 ID" Mk_Remarke="" Mk_Table="單位名稱" Mk_Version="Ver 3.00.0001"> 4 <Mk_Item class="object" Mk_Row="行號"> 5 <Mk_Item_Data class="array"> 6 <e class="object" Mk_Field="fg_dwbm"> 7 <Mk_Data type="string">系統中編碼[連線資料時提供]</Mk_Data> 8 </e> 9 <e class="object" Mk_Field="fg_dwbc"> 10 <Mk_Data type="string">系統中編碼[連線資料時提供]</Mk_Data> 11 </e> 12 </Mk_Item_Data> 13 </Mk_Item> 14 </Mk_Main_Info> 15 </o>
莫名其妙的多個不想要的元素‘o’,'e',以及屬性class="object"
3.1 去掉class="object"
1 public static void main(String[] args) { 2 String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?><Mk_Main_Info Mk_Id=\"本地系統中的 ID\" Mk_Version=\"Ver 3.00.0001\" Mk_Table=\"單位名稱\" Mk_Remarke=\"\">\n" + "\t\t<Mk_Item Mk_Row=\"行號\">\n" + "\t\t\t<Mk_Item_Data Mk_Field=\"fg_dwbm\">\n" + "\t\t\t\t<Mk_Data>系統中編碼[連線資料時提供]</Mk_Data>\n" + "\t\t\t</Mk_Item_Data>\n" + "\t\t\t<Mk_Item_Data Mk_Field=\"fg_dwbc\">\n" + "\t\t\t\t<Mk_Data>系統中編碼[連線資料時提供]</Mk_Data>\n" + "\t\t\t</Mk_Item_Data>\n" + "\t\t</Mk_Item>\n" + "\t</Mk_Main_Info>"; 3 System.out.println("==========xml to json================"); 4 XMLSerializer xmlSerializer = new XMLSerializer(); 5 // 預設false:不輸出根元素, true為輸出根元素 6 xmlSerializer.setForceTopLevelObject(true); 7 JSON read = xmlSerializer.read(xml); 8 String jsonStr = read.toString(); 9 System.out.println(jsonStr); 10 System.out.println("==========json to xml================"); 11 // TODO 注意: <Mk_Item class="object" Mk_Row="行號"> 型別提示 true:展示,false:不展示 12 xmlSerializer.setTypeHintsEnabled(false); 13 String write = xmlSerializer.write(JSONSerializer.toJSON(jsonStr), "gbk"); 14 System.out.println(write); 15 }
1 <?xml version="1.0" encoding="utf-8"?> 2 <o> 3 <Mk_Main_Info Mk_Id="本地系統中的 ID" Mk_Remarke="" Mk_Table="單位名稱" Mk_Version="Ver 3.00.0001"> 4 <Mk_Item Mk_Row="行號"> 5 <Mk_Item_Data> 6 <e Mk_Field="fg_dwbm"> 7 <Mk_Data>系統中編碼[連線資料時提供]</Mk_Data> 8 </e> 9 <e Mk_Field="fg_dwbc"> 10 <Mk_Data>系統中編碼[連線資料時提供]</Mk_Data> 11 </e> 12 </Mk_Item_Data> 13 </Mk_Item> 14 </Mk_Main_Info> 15 </o>
3.2 去掉元素 e
1 // 將jsonArray 的元素,去掉父節點 ‘e’ String[] expandableProperties = {"Mk_Item_Data"}; 2 xmlSerializer.setExpandableProperties(expandableProperties);
1 <?xml version="1.0" encoding="utf-8"?> 2 <o> 3 <Mk_Main_Info Mk_Id="本地系統中的 ID" Mk_Remarke="" Mk_Table="單位名稱" Mk_Version="Ver 3.00.0001"> 4 <Mk_Item Mk_Row="行號"> 5 <Mk_Item_Data Mk_Field="fg_dwbm"> 6 <Mk_Data>系統中編碼[連線資料時提供]</Mk_Data> 7 </Mk_Item_Data> 8 <Mk_Item_Data Mk_Field="fg_dwbc"> 9 <Mk_Data>系統中編碼[連線資料時提供]</Mk_Data> 10 </Mk_Item_Data> 11 </Mk_Item> 12 </Mk_Main_Info> 13 </o>
3.3 去掉元素o
這步需要注意,我們由xml生成的json是包括根元素的,我們可以在生成json的時候不生成根元素即 xmlSerializer.setForceTopLevelObject(false)
再由生成的json字串為入參,設定 xmlSerializer.setRootName("Mk_Main_Info")
1 public static void main(String[] args) { 2 String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?><Mk_Main_Info Mk_Id=\"本地系統中的 ID\" Mk_Version=\"Ver 3.00.0001\" Mk_Table=\"單位名稱\" Mk_Remarke=\"\">\n" + "\t\t<Mk_Item Mk_Row=\"行號\">\n" + "\t\t\t<Mk_Item_Data Mk_Field=\"fg_dwbm\">\n" + "\t\t\t\t<Mk_Data>系統中編碼[連線資料時提供]</Mk_Data>\n" + "\t\t\t</Mk_Item_Data>\n" + "\t\t\t<Mk_Item_Data Mk_Field=\"fg_dwbc\">\n" + "\t\t\t\t<Mk_Data>系統中編碼[連線資料時提供]</Mk_Data>\n" + "\t\t\t</Mk_Item_Data>\n" + "\t\t</Mk_Item>\n" + "\t</Mk_Main_Info>"; 3 JSONObject jsonObject = XML.toJSONObject(xml); 4 String jsonPrettyPrintString = jsonObject.toString(2); 5 System.out.println(jsonPrettyPrintString); 6 System.out.println("==========xml to json================"); 7 XMLSerializer xmlSerializer = new XMLSerializer(); 8 // true:輸出根元素 9 xmlSerializer.setForceTopLevelObject(false); 10 JSON read = xmlSerializer.read(xml); 11 String jsonStr = read.toString(); 12 System.out.println(jsonStr); 13 System.out.println("+++++++++++json to xml+++++++++++++"); 14 // 問題1:<Mk_Item class="object" Mk_Row="行號"> 型別提示 true:展示,false:不展示 15 xmlSerializer.setTypeHintsEnabled(false); 16 // 問題2:將jsonArray 的元素,去掉父節點 ‘e’ 17 String[] expandableProperties = {"Mk_Item_Data"}; 18 xmlSerializer.setExpandableProperties(expandableProperties); 19 // 問題3:去掉根節點 ‘o’ 20 xmlSerializer.setRootName("Mk_Main_Info"); // 自定義根元素 21 String write = xmlSerializer.write(JSONSerializer.toJSON(jsonStr), "utf-8"); 22 System.out.println(write); 23 }
1 <?xml version="1.0" encoding="utf-8"?> 2 <Mk_Main_Info Mk_Id="本地系統中的 ID" Mk_Remarke="" Mk_Table="單位名稱" Mk_Version="Ver 3.00.0001"> 3 <Mk_Item Mk_Row="行號"> 4 <Mk_Item_Data Mk_Field="fg_dwbm"> 5 <Mk_Data>系統中編碼[連線資料時提供]</Mk_Data> 6 </Mk_Item_Data> 7 <Mk_Item_Data Mk_Field="fg_dwbc"> 8 <Mk_Data>系統中編碼[連線資料時提供]</Mk_Data> 9 </Mk_Item_Data> 10 </Mk_Item> 11 </Mk_Main_Info>