【Java123】XML与JSON互相转化

本文探讨了使用org.json库将XML数据转换为JSON格式的方法,通过具体示例展示了转换过程,并对比了不同工具的转换结果。分析了转换中需考虑的特殊情况,如字段特殊字符处理、同名标签的数组化等,以及异常处理策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 http://www.bejson.com/json2javapojo/new/

https://www.cnblogs.com/111testing/p/9162229.html

https://wenku.baidu.com/view/8364d04b86c24028915f804d2b160b4e777f8102.html

https://www.jianshu.com/p/8dadd9a232b1

 

使用org.json的Demo:
 1 import org.apache.commons.io.IOUtils;
 2 import org.json.JSONException;
 3 import org.json.JSONObject;
 4 import org.json.XML;
 5 
 6 import java.io.IOException;
 7 import java.io.InputStream;
 8 
 9 public class XML2JSON {
10 
11     public XML2JSON(){}
12 
13     public static String xml2jsonString(String  filepath) throws IOException, JSONException {
14 
15         InputStream in = XML2JSON.class.getResourceAsStream(filepath);
16         String xml = IOUtils.toString(in);
17         System.out.print(xml);
18         System.out.println();
19 
20         JSONObject xmlJSONObj = XML.toJSONObject(xml);
21         String jsonStr = xmlJSONObj.toString();
22         System.out.print(jsonStr);
23 
24         return xmlJSONObj.toString();
25 
26     }
27 
28 
29     public static void main(String[] args) throws JSONException, IOException {
30 
31         String string = xml2jsonString("simple.xml");
32         System.out.println(string);
33 
34     }
35 
36 }
View Code

测试1:

<?xml version="1.0" encoding="ISO-8859-1"?>
<current_observation>
 <book id="bk101">
  <author>Gambardella, Matthew</author>
  <title>XML Developer's Guide</title>
  <genre>Computer</genre>
  <price>44.95</price>
  <publish_date>2000-10-01</publish_date>
  <description>An in-depth look at creating applications
   with XML.</description>
 </book>
 <book id="bk102">
 <author>Ralls, Kim</author>
 <title>Midnight Rain</title>
 <credit>NOAA's National Weather Service</credit>
 <credit_URL>http://weather.gov/</credit_URL>
 </book>
 <image>
  <url>http://weather.gov/images/xml_logo.gif</url>
  <title>NOAA's National Weather Service</title>
  <link>http://weather.gov</link>
 </image>
 <location>New York/John F. Kennedy Intl Airport, NY</location>
 <station_id>KJFK</station_id>
 <latitude>40.66</latitude>
 <longitude>-73.78</longitude>
 <observation_time_rfc822>
  Mon, 11 Feb 2008 06:51:00 -0500 EST
 </observation_time_rfc822>
 <weather>A Few Clouds</weather>
 <temp_f>11</temp_f>
 <temp_c>-12</temp_c>
 <relative_humidity>36</relative_humidity>
 <wind_dir>West</wind_dir>
 <wind_degrees>280</wind_degrees>
 <wind_mph>18.4</wind_mph>
 <wind_gust_mph>29</wind_gust_mph>
 <pressure_mb>1023.6</pressure_mb>
 <pressure_in>30.23</pressure_in>
 <dewpoint_f>-11</dewpoint_f>
 <dewpoint_c>-24</dewpoint_c>
 <windchill_f>-7</windchill_f>
 <windchill_c>-22</windchill_c>
 <visibility_mi>10.00</visibility_mi>
 <icon_url_base>
  http://weather.gov/weather/images/fcicons/
 </icon_url_base>
 <icon_url_name>nfew.jpg</icon_url_name>
 <two_day_history_url>
  http://www.weather.gov/data/obhistory/KJFK.html
 </two_day_history_url>
 <disclaimer_url>
  http://weather.gov/disclaimer.html
 </disclaimer_url>
 <copyright_url>
  http://weather.gov/disclaimer.html
 </copyright_url>
</current_observation>
 
{"current_observation":{"copyright_url":"http://weather.gov/disclaimer.html","windchill_f":-7,"windchill_c":-22,"book":[{"author":"Gambardella, Matthew","price":44.95,"genre":"Computer","description":"An in-depth look at creating applications\r\n\t\t\twith XML.","id":"bk101","title":"XML Developer's Guide","publish_date":"2000-10-01"},{"author":"Ralls, Kim","credit_URL":"http://weather.gov/","id":"bk102","title":"Midnight Rain","credit":"NOAA's National Weather Service"}],"latitude":40.66,"two_day_history_url":"http://www.weather.gov/data/obhistory/KJFK.html","temp_c":-12,"temp_f":11,"wind_mph":18.4,"wind_degrees":280,"icon_url_base":"http://weather.gov/weather/images/fcicons/","icon_url_name":"nfew.jpg","weather":"A Few Clouds","dewpoint_f":-11,"longitude":-73.78,"image":{"link":"http://weather.gov","title":"NOAA's National Weather Service","url":"http://weather.gov/images/xml_logo.gif"},"dewpoint_c":-24,"station_id":"KJFK","wind_dir":"West","pressure_in":30.23,"wind_gust_mph":29,"disclaimer_url":"http://weather.gov/disclaimer.html","location":"New York/John F. Kennedy Intl Airport, NY","relative_humidity":36,"pressure_mb":1023.6,"visibility_mi":10,"observation_time_rfc822":"Mon, 11 Feb 2008 06:51:00 -0500 EST"}}

 

测试2:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- Edited with XML Spy v2007 (http://www.altova.com) -->
<current_observation>
 <book/>
 <book></book>
 <book id="bk98"/>
 <book id="bk99">Hello World!</book>
 <book id="bk100">
  <author>Helen</author>
  <author>Jason</author>
 </book>

 <book id="bk101">
  <author>Gambardella, Matthew</author>
  <title>XML Developer's Guide</title>
  <genre>Computer</genre>
  <price>44.95</price>
  <publish_date>2000-10-01</publish_date>
  <description>An in-depth look at creating applications
   with XML.</description>
 </book>
 <book id="bk102">
 <author>Ralls, Kim</author>
 <title>Midnight Rain</title>
 <credit>NOAA's National Weather Service</credit>
 <credit_URL>http://weather.gov/</credit_URL>
 </book>
</current_observation>

{"current_observation":{"book":["","",{"id":"bk98"},{"id":"bk99","content":"Hello World!"},{"author":["Helen","Jason"],"id":"bk100"},{"author":"Gambardella, Matthew","price":44.95,"genre":"Computer","description":"An in-depth look at creating applications\r\n\t\t\twith XML.","id":"bk101","title":"XML Developer's Guide","publish_date":"2000-10-01"},{"author":"Ralls, Kim","credit_URL":"http://weather.gov/","id":"bk102","title":"Midnight Rain","credit":"NOAA's National Weather Service"}]}}

 

对比在线转换

http://www.bejson.com/xml2json/

JSON转换结果对比上边有几点不同:

1. 忽略无意义的book数据

 <book/>
 <book></book>

2. 缺省key值为#text

 

{
  "current_observation": {
    "book": [
      { "-id": "bk98" },
      {
        "-id": "bk99",
        "#text": "Hello World!"
      },
      {
        "-id": "bk100",
        "author": [
          "Helen",
          "Jason"
        ]
      },
      {
        "-id": "bk101",
        "author": "Gambardella, Matthew",
        "title": "XML Developer's Guide",
        "genre": "Computer",
        "price": "44.95",
        "publish_date": "2000-10-01",
        "description": "An in-depth look at creating applications
   with XML."
      },
      {
        "-id": "bk102",
        "author": "Ralls, Kim",
        "title": "Midnight Rain",
        "credit": "NOAA's National Weather Service",
        "credit_URL": "http://weather.gov/"
      }
    ]
  }
}

 

 

 

 

各路方法,有使用第三方API,或者自写遍历迭代方法。

 

在针对上述Demo的测试结果做分析,还需要进一步考虑以下几点:

1. 源XML文件自身特殊及复杂情况的转换定义。比如,字段含特殊字符,一个标签含多个属性,多个标签同名,invalid file等。

2. 目标JSON文件的转换定义。比如,各元素是否保持原有顺序,多个同名标签作为数组还是同级对象,等。

3. 转换过程中的异常处理。比如,转换中遇到无法解析而跳出导致该目标文件无效,异常捕获记录,等。

 

 

https://blog.youkuaiyun.com/bestxiaok/article/details/80443640

 

 

还有一个如何测试转换生成的JSON文件是否“正确”?

1. 是否是一个合格的JSON文件?

  • to fail fast
  • to avoid data corruption
  • to simplify processing code
  • to use validation code in tests

比较完备但复杂的做法:使用预定义的JSON-Schema来校验文件

  • https://github.com/java-json-tools/json-schema-validator

比较简单直接的做法:使用库加载JSON文件时抛出的异常来判断

 

2. 如何将测试预期结果JSON文件和待测JSON文件进行比对?(Github上只关注了Java)

  • https://github.com/fslev/json-compare
  • https://github.com/a2design-inc/json-compare

 

转载于:https://www.cnblogs.com/cathygx/p/10596964.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值