简体   繁体   English

用于XML到JSON到XML阻抗不匹配的Java库

[英]Java Library for XML to JSON to XML Impedance Mismatch

I need a lossless conversion of XML to JSON and back again using Java. 我需要将XML无损转换为JSON,然后再次使用Java。 I have used a Javascript library called jsonxml , which does it properly, but nothing in Java. 我使用了一个名为jsonxml的Javascript库,该库可以正常运行,但Java中没有任何内容。

The best I seem to have found it JSON-java , which is mention often in Stack Overflow, but it fails testing on too many fronts. 我似乎最好的发现它是JSON-java ,这在Stack Overflow中经常提到,但是它在很多方面都无法通过测试。

Here are my test case code... 这是我的测试用例代码...

//---------------------------------------------------
import org.json.*;
//---------------------------------------------------
public class rjx
    {
    //-----------------------------------------------
    private String j2x(String json)
        {
        return(XML.toString(new JSONObject(json)));
        }
    //-----------------------------------------------
    private String x2j(String xml)
        {
        return(XML.toJSONObject(xml).toString());
        }
    //-----------------------------------------------
    //-----------------------------------------------
    public static void main(String[] args)
        {
        //-------------------------------------------
        rjx o = new rjx();
        //-------------------------------------------
        try
            {
            String xml = new String();
            String reversed = new String();
            System.out.println("=======");
            xml = "<e/>";
            System.out.println(xml);
            reversed = o.j2x(o.x2j(xml));
            System.out.println(reversed);
            if (xml.equals(reversed))
                System.out.println("PASS");
            else
                System.out.println("FAIL");
            System.out.println("-------");
            xml = "<e>text</e>";
            System.out.println(xml);
            reversed = o.j2x(o.x2j(xml));
            System.out.println(reversed);
            if (xml.equals(reversed))
                System.out.println("PASS");
            else
                System.out.println("FAIL");
            System.out.println("-------");
            xml = "<e name='value' />";
            System.out.println(xml);
            reversed = o.j2x(o.x2j(xml));
            System.out.println(reversed);
            if (xml.equals(reversed))
                System.out.println("PASS");
            else
                System.out.println("FAIL");
            System.out.println("-------");
            xml = "<e name='value'>text</e>";
            System.out.println(xml);
            reversed = o.j2x(o.x2j(xml));
            System.out.println(reversed);
            if (xml.equals(reversed))
                System.out.println("PASS");
            else
                System.out.println("FAIL");
            System.out.println("-------");
            xml = "<e><a>text</a><b>text</b></e>";
            System.out.println(xml);
            reversed = o.j2x(o.x2j(xml));
            System.out.println(reversed);
            if (xml.equals(reversed))
                System.out.println("PASS");
            else
                System.out.println("FAIL");
            System.out.println("-------");
            xml = "<e><a>text</a><a>text</a></e>";
            System.out.println(xml);
            reversed = o.j2x(o.x2j(xml));
            System.out.println(reversed);
            if (xml.equals(reversed))
                System.out.println("PASS");
            else
                System.out.println("FAIL");
            System.out.println("-------");
            xml = "<e>text<a>text</a></e>";
            System.out.println(xml);
            reversed = o.j2x(o.x2j(xml));
            System.out.println(reversed);
            if (xml.equals(reversed))
                System.out.println("PASS");
            else
                System.out.println("FAIL");
            System.out.println("-------");
            xml = "<a>hello</a>";
            System.out.println(xml);
            reversed = o.j2x(o.x2j(xml));
            System.out.println(reversed);
            if (xml.equals(reversed))
                System.out.println("PASS");
            else
                System.out.println("FAIL");
            System.out.println("-------");
            xml = "<a x='y'>hello</a>";
            System.out.println(xml);
            reversed = o.j2x(o.x2j(xml));
            System.out.println(reversed);
            if (xml.equals(reversed))
                System.out.println("PASS");
            else
                System.out.println("FAIL");
            System.out.println("-------");
            xml = "<a id='a'><b id='b'>hey!</b></a>";
            System.out.println(xml);
            reversed = o.j2x(o.x2j(xml));
            System.out.println(reversed);
            if (xml.equals(reversed))
                System.out.println("PASS");
            else
                System.out.println("FAIL");
            System.out.println("-------");
            xml = "<a>x<c/>y</a>";
            System.out.println(xml);
            reversed = o.j2x(o.x2j(xml));
            System.out.println(reversed);
            if (xml.equals(reversed))
                System.out.println("PASS");
            else
                System.out.println("FAIL");
            System.out.println("-------");
            xml = "<x u=''/>";
            System.out.println(xml);
            reversed = o.j2x(o.x2j(xml));
            System.out.println(reversed);
            if (xml.equals(reversed))
                System.out.println("PASS");
            else
                System.out.println("FAIL");
            System.out.println("-------");
            xml = "<html><head><title>Xml/Json</title><meta name='x' content='y' /></head><body></body></html>";
            System.out.println(xml);
            reversed = o.j2x(o.x2j(xml));
            System.out.println(reversed);
            if (xml.equals(reversed))
                System.out.println("PASS");
            else
                System.out.println("FAIL");
            System.out.println("-------");
            xml = "<ol class='xoxo'><li>Subject 1<ol><li>subpoint a</li><li>subpoint b</li></ol></li><li><span>Subject 2</span><ol compact='compact'><li>subpoint c</li><li>subpoint d</li></ol></li></ol>";
            System.out.println(xml);
            reversed = o.j2x(o.x2j(xml));
            System.out.println(reversed);
            if (xml.equals(reversed))
                System.out.println("PASS");
            else
                System.out.println("FAIL");
            System.out.println("-------");
            xml = "<span class='vevent'><a class='url' href='http://www.web2con.com/'><span class='summary'>Web 2.0 Conference</span><abbr class='dtstart' title='2005-10-05'>October 5</abbr><abbr class='dtend' title='2005-10-08'>7</abbr><span class='location'>Argent Hotel, San Francisco, CA</span></a></span>";
            System.out.println(xml);
            reversed = o.j2x(o.x2j(xml));
            System.out.println(reversed);
            if (xml.equals(reversed))
                System.out.println("PASS");
            else
                System.out.println("FAIL");
            System.out.println("-------");
            xml = "<e><![CDATA[ .. some data .. ]]></e>";
            System.out.println(xml);
            reversed = o.j2x(o.x2j(xml));
            System.out.println(reversed);
            if (xml.equals(reversed))
                System.out.println("PASS");
            else
                System.out.println("FAIL");
            System.out.println("-------");
            xml = "<e><a /><![CDATA[ .. some data .. ]]><b /></e>";
            System.out.println(xml);
            reversed = o.j2x(o.x2j(xml));
            System.out.println(reversed);
            if (xml.equals(reversed))
                System.out.println("PASS");
            else
                System.out.println("FAIL");
            System.out.println("-------");
            xml = "<e>some text<![CDATA[ .. some data .. ]]>more text</e>";
            System.out.println(xml);
            reversed = o.j2x(o.x2j(xml));
            System.out.println(reversed);
            if (xml.equals(reversed))
                System.out.println("PASS");
            else
                System.out.println("FAIL");
            System.out.println("-------");
            xml = "<e>some text<![CDATA[ .. some data .. ]]><a /></e>";
            System.out.println(xml);
            reversed = o.j2x(o.x2j(xml));
            System.out.println(reversed);
            if (xml.equals(reversed))
                System.out.println("PASS");
            else
                System.out.println("FAIL");
            System.out.println("-------");
            xml = "<e><![CDATA[ .. some data .. ]]><![CDATA[ .. more data .. ]]></e>";
            System.out.println(xml);
            reversed = o.j2x(o.x2j(xml));
            System.out.println(reversed);
            if (xml.equals(reversed))
                System.out.println("PASS");
            else
                System.out.println("FAIL");
            System.out.println("-------");
            xml = "<e><![CDATA[ .. some data .. ]]><![CDATA[ .. & more data .. ]]></e>";
            System.out.println(xml);
            reversed = o.j2x(o.x2j(xml));
            System.out.println(reversed);
            if (xml.equals(reversed))
                System.out.println("PASS");
            else
                System.out.println("FAIL");
            System.out.println("-------");
            xml = "<e><![CDATA[ .. some data .. ]]><![PCDATA[ .. &amp; still more data .. ]]></e>";
            System.out.println(xml);
            reversed = o.j2x(o.x2j(xml));
            System.out.println(reversed);
            if (xml.equals(reversed))
                System.out.println("PASS");
            else
                System.out.println("FAIL");
            System.out.println("=======");
            }
        catch (Exception e)
            {
            System.err.println("error: rjx.main>>" + e.toString());
            System.exit(1);
            }
        System.exit(0);
        }
    //-----------------------------------------------
    }
//---------------------------------------------------

And the results... 结果是...

=======
<e/>
<e/>
PASS
-------
<e>text</e>
<e>text</e>
PASS
-------
<e name='value' />
<e><name>value</name></e>
FAIL
-------
<e name='value'>text</e>
<e><name>value</name>text</e>
FAIL
-------
<e><a>text</a><b>text</b></e>
<e><a>text</a><b>text</b></e>
PASS
-------
<e><a>text</a><a>text</a></e>
<e><a>text</a><a>text</a></e>
PASS
-------
<e>text<a>text</a></e>
<e><a>text</a>text</e>
FAIL
-------
<a>hello</a>
<a>hello</a>
PASS
-------
<a x='y'>hello</a>
<a><x>y</x>hello</a>
FAIL
-------
<a id='a'><b id='b'>hey!</b></a>
<a><b><id>b</id>hey!</b><id>a</id></a>
FAIL
-------
<a>x<c/>y</a>
<a><c/>x
y</a>
FAIL
-------
<x u=''/>
<x><u/></x>
FAIL
-------
<html><head><title>Xml/Json</title><meta name='x' content='y' /></head><body></body></html>
<html><head><meta><name>x</name>y</meta><title>Xml/Json</title></head><body/></html>
FAIL
-------
<ol class='xoxo'><li>Subject 1<ol><li>subpoint a</li><li>subpoint b</li></ol></li><li><span>Subject 2</span><ol compact='compact'><li>subpoint c</li><li>subpoint d</li></ol></li></ol>
<ol><class>xoxo</class><li><ol><li>subpoint a</li><li>subpoint b</li></ol>Subject 1</li><li><ol><compact>compact</compact><li>subpoint c</li><li>subpoint d</li></ol><span>Subject 2</span></li></ol>
FAIL
-------
<span class='vevent'><a class='url' href='http://www.web2con.com/'><span class='summary'>Web 2.0 Conference</span><abbr class='dtstart' title='2005-10-05'>October 5</abbr><abbr class='dtend' title='2005-10-08'>7</abbr><span class='location'>Argent Hotel, San Francisco, CA</span></a></span>
<span><a><href>http://www.web2con.com/</href><abbr><title>2005-10-05</title><class>dtstart</class>October 5</abbr><abbr><title>2005-10-08</title><class>dtend</class>7</abbr><class>url</class><span><class>summary</class>Web 2.0 Conference</span><span><class>location</class>Argent Hotel, San Francisco, CA</span></a><class>vevent</class></span>
FAIL
-------
<e><![CDATA[ .. some data .. ]]></e>
<e> .. some data .. </e>
FAIL
-------
<e><a /><![CDATA[ .. some data .. ]]><b /></e>
<e><a/><b/> .. some data .. </e>
FAIL
-------
<e>some text<![CDATA[ .. some data .. ]]>more text</e>
<e><array>some text</array><array> .. some data .. </array><array>more text</array></e>
FAIL
-------
<e>some text<![CDATA[ .. some data .. ]]><a /></e>
<e><a/>some text
 .. some data .. </e>
FAIL
-------
<e><![CDATA[ .. some data .. ]]><![CDATA[ .. more data .. ]]></e>
<e><array> .. some data .. </array><array> .. more data .. </array></e>
FAIL
-------
<e><![CDATA[ .. some data .. ]]><![CDATA[ .. & more data .. ]]></e>
<e><array> .. some data .. </array><array> .. &amp; more data .. </array></e>
FAIL
-------
<e><![CDATA[ .. some data .. ]]><![PCDATA[ .. &amp; still more data .. ]]></e>
error: rjx.main>>org.json.JSONException: Expected 'CDATA[' at 41 [character 42 line 1]

Is there a library, perhaps a fork of JSON-java, which can pass all the tests? 是否有一个库,可能是JSON-java的一个分支,可以通过所有测试?

By the way, I can forgive the failures for order mismatch, that is within my specification, but structure changes are not. 顺便说一句,我可以原谅规范中的订单不匹配失败,但结构更改并非如此。

It depends on your exact requirements. 这取决于您的确切要求。

For example, if you see 例如,如果您看到

<p id="foo" class='  x  '>Hello, <i>cruel</i> world.</p   >

does it count as "lossless" if you get the following back? 如果您得到以下反馈,它算作“无损”吗?

<p class='x' id='foo'>, <i>cruel</i> world.</p>

If that does not count as lossless, then it will be very hard to do lossless round-trips except by just escaping and quotes in the XML and calling the whole thing one JSON string. 如果这算不上是无损的,那么将很难进行无损的往返,除非只是在XML中转义和引号,然后将整个内容称为一个JSON字符串。 That's of course easy, but JSON won't know anything at all about what's inside. 这当然很容易,但是JSON根本不了解其中的内容。

Almost any XML parser will discard the white-space differences inside of tags; 几乎所有的XML解析器都将丢弃标记内部的空白差异; that's the designed behavior. 这就是设计的行为。 Some also return the attributes without regard to order. 有些也返回属性而不考虑顺序。 An off-the-shelf conversion to JSON probably will put the attributes into a JSON hash, after which their original order is certainly gone, so unrecoverable. 对JSON的现成转换可能会将属性放入JSON哈希中,此后它们的原始顺序肯定消失了,因此无法恢复。 There are a few other issues, like whether "&#nbsp;" 还有其他一些问题,例如是否为“&#nbsp;” == "&#160;" ==“&#160;” == "&#xA0;".... Using "Canonical XML" (see https://www.w3.org/TR/xml-c14n11/ ) would help avoid such issues. ==“&#xA0;” ....使用“规范XML”(请参阅https://www.w3.org/TR/xml-c14n11/ )将有助于避免此类问题。

I'm a little puzzled, though, because I can't think of an environment that doesn't have an XML parser available. 但是,我有些困惑,因为我无法想到没有XML解析器可用的环境。 Why not do no conversion at all, and just parse XML at the destination? 为什么不完全不进行转换,而仅在目标位置解析XML? It sounds as if the destination doesn't change the data, because if it does round-tripping obviously won't work at all. 听起来好像目的地没有更改数据,因为如果这样做,往返显然将根本无法工作。 And if you send the XML, it's easier for the destination to validate it to make sure it's ok. 而且,如果您发送XML,则目的地可以更轻松地对其进行验证以确保其正常。

On the other hand, if the example above does count as "lossless" for your purposes, things get a lot easier. 另一方面,如果出于您的目的上述示例确实算作“无损”,那么事情会变得容易得多。 Because XML elements have significant names and order which you'll have to preserve, whatever you use should probably create both a JSON array and a JSON hash for each element. 因为XML元素具有重要的名称和必须保留的顺序 ,所以使用的任何内容都可能会为每个元素创建JSON数组和JSON哈希。 Perhaps the easiest is like: 也许最简单的是:

[ { "#":"p" "id":""foo"" "class":""x"" },
    "Hello, ",
    [ { "#":"i" },
        "cruel"
    ], 
    "world."
]

I don't know of a Javascript or Java library that does that or equivalent. 我不知道执行此操作或等效操作的Javascript或Java库。 I have Python for it, but it's a bit large to just paste here. 我有Python,但仅粘贴到此处有点大。 You can get fairly close with just this: 您可以通过以下方式获得相当接近的效果:

sed -E \
-e 's@>([^<]+)@>"\1"<@g' \ 
-e 's@<([^\s/>]+)(\s+[^>]*)?/>@[{"#":"\1", \2}],@g' \ 
-e 's@<([^\s/>]+)(\s+[^>]*)?>@[{"#":"\1", \2},@g' \
-e 's@<\?(\w+)(\s+([^?]|\?[^>])*)?\?>@[{"#":"#PI", "#target":"\1", \2]}@g' \ 
-e 's@<!--(([^-]|-[^-]|--[^>])*)-->@/* \1 */@g' \ 
-e 's@\s+(\w+)\s*=\s*("[^"]*")@ "\1":"\2",@g' \ 
-e 's@</([^\s/>]+)\s*>@],@g' \ 
-e 's@&#[xX]([0-9a-fA-F]+);@\\u{\1}@g' \ 
-e 's@&lt;@<@g' \ 
-e 's@&gt;@>@g' \ 
-e 's@&amp;@&@g' \ 
-e 's@&lsqb;@[@g' \ 
-e 's@&rsqb;@]@g' \ 
-e 's@"\s*([-+]?\d+(\.\d+)?([eE][-+?]\d+)?)\s*"@\1@g'

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM