zoukankan      html  css  js  c++  java
  • Atitit xml转json总结 目录 1.1. XML和JSON之间没有直接映射;元素类型问题 1 1.2. Xml与json的对应关系 2 1.3. 范例 2 2. Jsonlib的问题,,不

    Atitit xml转json总结

     

    目录

    1.1. XML和JSON之间没有直接映射;元素类型问题 1

    1.2. Xml与json的对应关系 2

    1.3. 范例 2

    2. Jsonlib的问题,,不支持type属性 2

    3. org.json也可以 推荐 2

    4. Other 3

    4.1. 通过转换map中转也麻烦,因为要建立bean,或者特定格式的 3

    4.2. 测试一下可以转换简单的不能转复杂的,嵌套的xml 5

     

     

      1. XML和JSON之间没有直接映射;元素类型问题

    Fastjson冒失是潜入一个@type指明类型

    XML带有类型信息(每个元素都有一个名称)以及命名空间。因此,除非每个JSON对象都嵌入了类型信息,否则转换将是有损的。

    但这并不一定要紧。重要的是JSON的使用者知道数据协定。例如,给定以下XML:

    <books>

      <book author="Jimbo Jones" title="Bar Baz">

        <summary>Foo</summary>

      </book>

      <book title="Don't Care" author="Fake Person">

        <summary>Dummy Data</summary>

      </book></books>

    您可以将其转换为:

    {

        "books": [

            { "author": "Jimbo Jones", "title": "Bar Baz", "summary": "Foo" },

            { "author": "Fake Person", "title": "Don't Care", "summary": "Dummy Data" },

        ]

    }

    消费者不需要知道books集合中的每个对象都是一个book对象。

     

      1. Xml与json的对应关系

     

    String xml = "<hello><test to='toUser@longbourn.lit/study' >1.2</test><test2>123</test2></hello>";

     

    {"test":{"@to":"toUser@longbourn.lit/study","#text":"1.2"},"test2":"123"}

     

    Xml元素通过json子对象模式实现,,xml属性通过 sjon属性@prop实现,其实我觉得直接抓换为json属性也可呀。。Xml标签内容,通过json属性#text来实现。。

     

     

      1. 范例

     

    <message from="romUser@xxx.com">

    <body>bodytxt</body>

    </message>

    {"@from":"romUser@xxx.com","body":"bodytxt"}

     

    1. Jsonlib的问题,,不支持type属性

    丢失root跟标签xml标签

    1.  org.json也可以 推荐

    支持type属性比较完美,支持root总标签,不丢失标签

     

    {"message":{"from":"romUser@xxx.com","to":"toUser@longbourn.lit/study","type":"groupchat","body":"bodytxt"}}

    1. Other
      1. 通过转换map中转也麻烦,因为要建立bean,或者特定格式的

     

     

    2. xml字符串 转JSON

        xml转JON 需要借助 jackSon的 fastxml包来实现

            <!-- fasterxml -->

            <dependency>

                <groupId>com.fasterxml</groupId>

                <artifactId>jackson-xml-databind</artifactId>

                <version>0.6.2</version>

            </dependency>

        /**

         * xml 转json

         */

        public static JSONObject convertXmlToJson(String xml) throws IOException {

            XmlMapper xmlMapper = new XmlMapper();

            JSONObject param = xmlMapper.readValue(xml, JSONObject.class);

     

            return param;

        }

    利用XmlMapper这个类, 简单两段代码就可以搞定 但是该方法有个缺点, 如果你的xml字符串转换的内容里 有数组的情况下, 直接这样转是不行的。 这种情况就要自己建立相应的实体类来做接收。 注:实体要有相应的getset方法, 并要保证和xml中的字段名一一对应。

     

     

     

    另外一种方式是使用org.json来实现,这种方式更简单,只需要两个jar包即可,下载地址http://mvnrepository.com/artifact/org.json/json,随便下载一个使用比较多的jar包版本即可,具体实现代码见下 

     

    public class JsonUtils {

        public static String xml2jsonString() throws JSONException, IOException {

            InputStream in = JsonUtils.class.getResourceAsStream("student.xml");

            String xml = IOUtils.toString(in);

            JSONObject xmlJSONObj = XML.toJSONObject(xml);

            return xmlJSONObj.toString();

        }

     

        public static void main(String[] args) throws JSONException, IOException {

     

            String string = xml2jsonString();

            System.out.println(string);

     

        }

    }

     

     

      简单对比一下使用json-lib的实现方式,前面的代码基本一致,区别是这里使用的是org.json.XML类,调用的是toJSONObject方法,接受的是一个xml格式的字符串,生成一个JSONObject对象,这里也是一样,调不调用jsonobject的toString方法输出效果都一样,xml文件内容一样,输出的格式见下 

    {"student":{"sex":"man","name":"zhangsan"}}

     

     

    最后总结一下: 
      1 json-lib依赖的jar包很多,需要全部集齐,org.json仅仅需要两个jar包即可实现,一个org.json另一个是commons-io 
    2 两者输出的xml格式不同,前者不带根标签需要手动添加,会区别标签的属性和子标签,后者带有根标签,标签的属性和子标签不会区分对待,因此根据自己的实际情况自行选择修改即可。 
    PS:如果还有其他的更好的xml转json方式,希望各位大神能告诉一下,再次先谢过了,那么这篇到此结束先了

     

      1. 测试一下可以转换简单的不能转复杂的,嵌套的xml

     

    Atitit.xml转换map 通用对象的实现

     

    public class XMLParser 

      public static Map<String,Object> getMapFromXML(String xmlString) throws ParserConfigurationException, IOException, SAXException {

     

            //这里用Dom的方式解析回包的最主要目的是防止API新增回包字段

            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

            DocumentBuilder builder = factory.newDocumentBuilder();

            InputStream is =  Util.getStringStream(xmlString);

            Document document = builder.parse(is);

     

            //获取到document里面的全部结点

            NodeList allNodes = document.getFirstChild().getChildNodes();

            Node node;

            Map<String, Object> map = new HashMap<String, Object>();

            int i=0;

            while (i < allNodes.getLength()) {

                node = allNodes.item(i);

                if(node instanceof Element){

                    map.put(node.getNodeName(),node.getTextContent());

                }

                i++;

            }

            return map;

     

    }

     

    还有个。。wechatx4pay  。。。

    思路,先转换为潜逃的map。。但是貌似只能手工转,这些框架都不能像自动转换

     

     

     

     

     

    Exception in thread "main" net.sf.json.JSONException: java.lang.NullPointerException: Cannot invoke "String.compareToIgnoreCase(String)" because "type" is null

    at net.sf.json.xml.XMLSerializer.read(XMLSerializer.java:331)

    at hsimprjMavenAid.Xml2Json.xmppmsg(Xml2Json.java:32)

    at hsimprjMavenAid.Xml2Json.main(Xml2Json.java:16)

    Caused by: java.lang.NullPointerException: Cannot invoke "String.compareToIgnoreCase(String)" because "type" is null

    at net.sf.json.xml.XMLSerializer.setValue(XMLSerializer.java:1236)

    at net.sf.json.xml.XMLSerializer.processObjectElement(XMLSerializer.java:1095)

    at net.sf.json.xml.XMLSerializer.read(XMLSerializer.java:322)

    ... 2 more

     

    原因是因为是有个type属性,可能关键词重名了。。。

     

     

    在Java中将XML转换为JSON的最快方法 - Thinbug

  • 相关阅读:
    算法的时间与空间复杂度(一看就懂)
    技术人更应该学会即兴表达
    架构设计之「数据库集群方案」
    架构设计之「数据库从主备到主主的高可用方案」
    网络中的「动态路由算法」,你了解吗?
    当你「ping 一下」的时候,你知道它背后的逻辑吗?
    不懂高性能的负载均衡设计?没关系,架构师带你飞
    piwik流量统计系统搭建(apache2.4+piwik+mysql5.6+php5.6.14)
    SQL Server 之 GROUP BY、GROUPING SETS、ROLLUP、CUBE
    CAS 实现单点登录 .NET MVC
  • 原文地址:https://www.cnblogs.com/attilax/p/15196882.html
Copyright © 2011-2022 走看看