<!--
  ~ Licensed to the Apache Software Foundation (ASF) under one
  ~ or more contributor license agreements. See the NOTICE file
  ~ distributed with this work for additional information
  ~ regarding copyright ownership. The ASF licenses this file
  ~ to you under the Apache License, Version 2.0 (the
  ~ "License"); you may not use this file except in compliance
  ~ with the License. You may obtain a copy of the License at
  ~
  ~ http://www.apache.org/licenses/LICENSE-2.0
  ~
  ~ Unless required by applicable law or agreed to in writing,
  ~ software distributed under the License is distributed on an
  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  ~ KIND, either express or implied. See the License for the
  ~ specific language governing permissions and limitations
  ~ under the License.
  -->

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta name="generator" content=
"HTML Tidy for Windows (vers 14 June 2007), see www.w3.org" />
<meta http-equiv="content-type" content=
"text/html; charset=us-ascii" />
<title></title>
<meta name="AUTHOR" content="Isuru Suriarachchi" />
<meta name="CREATED" content="20070203;331600" />
<meta name="CHANGEDBY" content="Isuru Suriarachchi" />
<meta name="CHANGED" content="20070208;12031400" />
<style type="text/css">
/*<![CDATA[*/
        <!--
@page { size: 8.5in 11in; margin: 0.79in }
P { margin-bottom: 0.08in }
-->

/*]]>*/
</style>
</head>
<body>
<h1 class="title">JSON Support in Axis2</h1>
<p>This document explains the JSON support implementation in Axis2.
It includes an introduction to JSON, an outline as to why JSON
support is useful to Axis2 and how it should be used. This document
also provides details on test cases and samples.</p>
<h3>What is JSON?</h3>
<p><a href="http://www.json.org/">JSON</a> (Java Script Object
Notation) is another data exchangeable format like XML, but more
lightweight and easily readable. It is based on a subset of the
JavaScript language. Therefore, JavaScript can understand JSON, and
it can make JavaScript objects by using JSON strings. JSON is based
on key-value pairs and it uses colons to separate keys and values.
JSON doesn't use end tags, and it uses braces (curly brackets) to
enclose JSON Objects.</p>
<p><font size="3">e.g. <font size="2">&lt;root&gt;&lt;test&gt;json
object&lt;/test&gt;&lt;/root&gt; ==
{{json object}}</font></font></p>
<p>When it comes to converting XML to JSON and vice versa, there
are two major conventions, one named "<a href=
"http://www.sklar.com/badgerfish/">Badgerfish</a>" and the other,
Mapped. The main difference
between these two conventions exists in the way they map XML
namespaces into JSON.</p>
<p><font size="3">e.g. <font size="2">&lt;xsl:root
xmlns:xsl="http://foo.com"&gt;&lt;data&gt;my json
string&lt;/data&gt;&lt;/xsl:root&gt;</font></font></p>
<p>This XML string can be converted into JSON as follows.</p>
<p><b>Using Badgerfish</b></p>
<p><font size=
"2">{"xsl:root":{"@xmlns":{"xsl":"http://foo.com"},"data":{"$":"my
json string"}}}</font></p>
<p><b>Using Mapped</b></p>
<p>If we use the namespace mapping as http://foo.com -&gt; foo</p>
<p><font size="2">{"foo.root":{"data":"my json string"}}</font></p>
<p>JSON support is a new feature in <a href=
"../index.html">Apache Axis2/Java</a>. It will become
a crucial improvement in the future with applications like
JavaScript Web services.</p>
<h2>Why JSON Support for Axis2?</h2>
<p><a href="../index.html">Apache Axis2</a> is a Web
services stack that delivers incoming messages into target
applications. In most cases, these messages are SOAP messages. In
addition, it is also possible to send REST messages through Axis2.
Both types of messages use XML as their data exchangeable format.
So if we can use XML as a format, why use JSON as another
format?</p>
<p>There are many advantages of implementing JSON support in Axis2.
Mainly, it helps the JavaScript users (services and clients written
in JavaScript) to deal with Axis2. When the service or the client
is in JavaScript, it can use the JSON string and directly build
JavaScript objects to retrieve information, without having to build
the object model (OMElement in Axis2). Also, JavaScript services
can return the response through Axis2, just as a JSON string can be
shipped in a JSONDataSource.</p>
<p>Other than for that, there are some extra advantages of using
JSON in comparison to XML. Although the conversation
XML or JSON? is still a hot topic,
many people accept the fact that JSON can be passed and built more
easily by machines than XML.</p>
<p>For more details of this implementation architecture, refer to
the article <a href="http://wso2.org/library/768">"JSON Support for
Apache Axis2"</a></p>
<h2>How to use JSON in Axis2</h2>
<p>At the moment JSON doesn't have a standard and unique content
type. application/json (this is
the content type which is approved in the <a href=
"http://www.ietf.org/rfc/rfc4627.txt?number=4627">JSON RFC</a> ),
text/javascript and
text/json are some of the commonly
used content types of JSON. Due to this problem, in Axis2, the user
has been given the freedom of selecting the content type.</p>
<h3>Step 1</h3>
<p>Map the appropriate MessageFormatter and OMBuilder with the
content type you are using in the axis2.xml file.</p>
<p>e.g.1: If you are using the
Mapped convention with the content
type application/json</p>
<pre>
        &lt;messageFormatters&gt;        
                &lt;messageFormatter contentType="application/json"
                                 class="org.apache.axis2.json.JSONMessageFormatter"/&gt;
                &lt;!-- more message formatters --&gt;
        &lt;/messageFormatters&gt;   
    
        &lt;messageBuilders&gt;
                &lt;messageBuilder contentType="application/json"
                                 class="org.apache.axis2.json.JSONOMBuilder"/&gt;
                &lt;!-- more message builders --&gt;
        &lt;/messageBuilders&gt;
</pre>
<p>e.g.2: If you are using the
Badgerfish convention with the
content type text/javascript</p>
<pre>
        &lt;messageFormatters&gt;        
                &lt;messageFormatter contentType="text/javascript"
                                 class="org.apache.axis2.json.JSONBadgerfishMessageFormatter"/&gt;
                &lt;!-- more message formatters --&gt;
        &lt;/messageFormatters&gt; 

        &lt;messageBuilders&gt;
                &lt;messageBuilder contentType="text/javascript"
                                 class="org.apache.axis2.json.JSONBadgerfishOMBuilder"/&gt;
                &lt;!-- more message builders --&gt;
        &lt;/messageBuilders&gt;
</pre>
<h3>Step 2</h3>
<p>On the client side, make the ConfigurationContext by reading the
axis2.xml in which the correct mappings are given.</p>
<p>e.g.</p>
<pre>
        File configFile = new File("test-resources/axis2.xml");
        configurationContext = ConfigurationContextFactory
                        .createConfigurationContextFromFileSystem(null, configFile.getAbsolutePath());
        ..........        
        ServiceClient sender = new ServiceClient(configurationContext, null);
</pre>
<h3>Step 3</h3>
<p>Set the <i>MESSAGE_TYPE</i> option with exactly the same content
type you used in the axis2.xml.</p>
<p>e.g. If you use the content type
application/json,</p>
<pre>
        Options options = new Options();        
        options.setProperty(Constants.Configuration.MESSAGE_TYPE, application/json);
        //more options
        //...................        

        ServiceClient sender = new ServiceClient(configurationContext, null);        
        sender.setOptions(options);
</pre>
<p>If you are sending a request to a remote service, you have to
know the exact JSON content type that is used by that service, and
you have to use that content type in your client as well.</p>
<p>HTTP POST is used as the default method to send JSON messages
through Axis2, if the HTTP method is not explicitly set by the
user. But if you want to send JSON in HTTP GET method as a
parameter, you can do that by just setting an option on the client
side.</p>
<p>e.g.
<code>options.setProperty(Constants.Configuration.HTTP_METHOD,
Constants.Configuration.HTTP_METHOD_GET);</code></p>
<p>Here, the Axis2 receiving side (JSONOMBuilder) builds the
OMElement by reading the JSON string which is sent as a parameter.
The request can be made even through the browser.</p>
<p>e.g. Sample JSON request through HTTP GET. The JSON message is
encoded and sent.</p>
<p><code>GET
/axis2/services/EchoXMLService/echoOM?query=%7B%22echoOM%22:%7B%22data%22:%5B%22my%20json%20string%22,%22my%20second%20json%20string%22%5D%7D%7D
HTTP/1.1</code></p>
<h2>Tests and Samples</h2>
<h3>Integration Test</h3>
<p>The JSON integration test is available under
test in the
json module of Axis2. It uses the
SimpleHTTPServer to deploy the service. A simple echo service is
used to return the incoming OMSourcedElementImpl object, which
contains the JSONDataSource. There are two test cases for two
different conventions and another one test case to send the request
in GET.</p>
<h3>Yahoo-JSON Sample</h3>
<p>This sample is available in the
samples module of Axis2. It is a
client which calls the Yahoo search API using the GET method, with
the parameter output=json. The
Yahoo search service sends the response as a
formatted JSON string with
the content type text/javascript.
This content type is mapped with the JSONOMBuilder in the
axis2.xml. All the results are shown in a GUI. To run the sample,
execute the ant script.</p>
<p>These two applications provide good examples of using JSON
within Axis2. By reviewing these samples, you will be able to
better understand Axis2's JSON support implementation.</p>
</body>
</html>
