tags:

views:

174

answers:

3
+1  Q: 

Json to XML tool?

Hi all,

I have one json file but an application that I use imports data only from xml files. So does somebody know of a tool that converts json files to xml? I've been looking for such tool for a few hours and could only find tools that create json files from xml.

Thanks!

+1  A: 

See this question for a XSLT converter (quite cool): http://stackoverflow.com/questions/559296/java-implementation-of-json-to-xml-conversion

svens
A: 

If you're using the .NET Framework, you can do this in code:

  • Create a JSON reader over your JSON content using the JsonReaderWriterFactory class
  • Create a regular XmlWriter, and call WriteNode on it giving it the JSON reader. It will write out XML corresponding to your JSON.

Caveats:

  • This will use a Microsoft-proprietary JSON-to-XML mapping (there isn't a standard one). The XML will look strange.
  • There were some serious bugs blocking this scenario in .NET3.5. Maybe fixed in .NET 3.5 SP1, maybe fixed in 4.0, fixed for sure in Silverlight 3
Eugene Osovetsky
A: 

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>
Dimitre Novatchev