Java implementation of JSON to XML conversion

61,207

Solution 1

Not a Java, but a pure XSLT 2.0 implementation:

Have a look at the f:json-document() from the FXSL 2.x library.

Using this function it is extremely easy to incorporate JSon and use it just as... XML.

For example, one can just write the following XPath expression:

f:json-document($vstrParam)/Students/*[sex = 'Female']

and get all children of Students with sex = 'Female'

Here is the complete example:

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema"
 xmlns:f="http://fxsl.sf.net/"
 exclude-result-prefixes="f xs"
 >
 <xsl:import href="../f/func-json-document.xsl"/>

 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:variable name="vstrParam" as="xs:string">
{

  "teacher":{
    "name":
      "Mr Borat",
    "age":
      "35",
    "Nationality":
      "Kazakhstan"
             },


  "Class":{
    "Semester":
      "Summer",
    "Room":
      null,
    "Subject":
      "Politics",
    "Notes":
      "We're happy, you happy?"
           },

  "Students":
    {
      "Smith":
        {"First Name":"Mary","sex":"Female"},
      "Brown":
        {"First Name":"John","sex":"Male"},
      "Jackson":
        {"First Name":"Jackie","sex":"Female"}
    }
    ,


  "Grades":

    {
      "Test":
      [
        {"grade":"A","points":68,"grade":"B","points":25,"grade":"C","points":15},

        {"grade":"C","points":2, "grade":"B","points":29, "grade":"A","points":55},

        {"grade":"C","points":2, "grade":"A","points":72, "grade":"A","points":65}
       ]
    }


}
 </xsl:variable>

 <xsl:template match="/">
    <xsl:sequence select=
     "f:json-document($vstrParam)/Students/*[sex = 'Female']"/>

 </xsl:template>
</xsl:stylesheet>

When the above transformation is applied on any XML document (ignored), the correct result is produced:

<Smith>
   <First_Name>Mary</First_Name>
   <sex>Female</sex>
</Smith>
<Jackson>
   <First_Name>Jackie</First_Name>
   <sex>Female</sex>
</Jackson>

Solution 2

You can create a JSONObject, and then convert it to XML using the XML class in the org.json namespace

Wrapping the json string in the object is as easy as passing it in its constructor

JSONObject o = new JSONObject(jsonString);

Then you can get it in XML format using the XML class, like so:

String xml = org.json.XML.toString(o);

Solution 3

One more possibility: Jettison, http://jettison.codehaus.org can expose Json via XML parsing interface (stax XMLStreamReader), which allows integration with systems that only understand XML. It requires use of a convention (badgerfish, or whatever the other one was called).

XStream, for example, uses Jettison (or at least Badgerfish convention) to allow use of JSON.

But the question itself is bit vague: while you can always convert from one to the othe (it is a very trivial thing to do really), XML and JSON are not equivalent: there is no one-to-one lossless generic mapping. Hence, the question is: what are you planning to do with results, how is resulting xml to be used?

Solution 4

You may want to try XStream. Take a look at http://x-stream.github.io/faq.html#JSON.

Solution 5

http://json-lib.sourceforge.net/

  • the points above about no completely foolproof one-one mapping are valid, but I have had a good experience with converting xml to json using the above library.
Share:
61,207
dacracot
Author by

dacracot

an old geek

Updated on July 11, 2020

Comments

  • dacracot
    dacracot almost 4 years

    Are there existing JARs available to convert from JSON to XML?

  • avernet
    avernet about 15 years
    Looks great. But I tried and f:json-document() is always returning an empty document. I posted about this in the SF.net forum: sourceforge.net/forum/message.php?msg_id=7385342
  • Dimitre Novatchev
    Dimitre Novatchev about 15 years
    There is an example how to use this fuction. It is the testFunc-json-document.xsl file in the Tests folder: fxsl.cvs.sourceforge.net/viewvc/fxsl/fxsl-xslt2/Tests/… When applied on any XML file (not used) this transformation produces the correct result. One potential factor that could cause your problem is the use of relatively old version of Saxon -- please use a 9.x version of Saxon. Also, the link in your message is unreachable.
  • Jon
    Jon over 11 years
    That is amazingly simple, thank you!
  • Ankit Srivastava
    Ankit Srivastava over 10 years
    Can you please elaborate??i mean do i have to use external jars?eclipse won't recognize these commands
  • Browny Lin
    Browny Lin over 10 years
  • Abel Callejo
    Abel Callejo over 10 years
    @AnkitSrivastava, the source java files for the classes JSONObject & XML can be downloaded from github.com/douglascrockford/JSON-java (json.org/java). You still have to make the jar yourself though. But if you're working with Google App Engine, the classes JSONObject & XML can be found in com.google.appengine.labs.repackaged.org.json.*
  • Paras Singh
    Paras Singh over 6 years
    JSONObject jsonObject = new JSONObject(json.toString())...This line throws an error saying "no suitable constructor found for JSONObject(String)"