<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Example: JSON with Y.io</title>
<link rel="stylesheet" href="http://fonts.googleapis.com/css?family=PT+Sans:400,700,400italic,700italic">
<link rel="stylesheet" href="../../build/cssgrids/cssgrids-min.css">
<link rel="stylesheet" href="../assets/css/main.css">
<link rel="stylesheet" href="../assets/vendor/prettify/prettify-min.css">
<link rel="shortcut icon" type="image/png" href="../assets/favicon.png">
<script src="../../build/yui/yui-min.js"></script>
</head>
<body>
<!--
<a href="https://github.com/yui/yui3"><img style="position: absolute; top: 0; right: 0; border: 0;" src="https://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png" alt="Fork me on GitHub"></a>
-->
<div id="doc">
<div id="hd">
<h1><img src="http://yuilibrary.com/img/yui-logo.png"></h1>
</div>
<h1>Example: JSON with Y.io</h1>
<div class="yui3-g">
<div class="yui3-u-3-4">
<div id="main">
<div class="content"><div class="intro">
<p>
A natural fit for the JSON module is to work with IO to parse JSON messages received via XMLHttpRequest (XHR). In this example, we'll request JSON data from the server using the <a href="http://yuilibrary.com/yui/docs/api/classes/IO.html#method_io"><code>Y.io()</code></a> method and parse the resulting JSON string data.
</p>
</div>
<div class="example yui3-skin-sam">
<div id="demo" class="yui3-skin-sam">
<p>Click the <em>Get Messages</em> button to send the request to the server; the response will be displayed below the button.</p>
<p><button>Get Messages</button></p>
<div id="demo-messages"></div>
</div>
<script>
// Create business logic in a YUI sandbox using the 'io' and 'json' modules
YUI().use("node", "io", "dump", "json-parse", function (Y) {
// capture the node that we'll display the messages in
var target = Y.one('#demo-messages');
// Create the io callback/configuration
var callback = {
timeout : 3000,
on : {
success : function (x,o) {
Y.log("RAW JSON DATA: " + o.responseText);
var messages = [],
html = '', i, l;
// Process the JSON data returned from the server
try {
messages = Y.JSON.parse(o.responseText);
}
catch (e) {
alert("JSON Parse failed!");
return;
}
Y.log("PARSED DATA: " + Y.Lang.dump(messages));
// The returned data was parsed into an array of objects.
// Add a P element for each received message
for (i=0, l=messages.length; i < l; ++i) {
html += '<p>' + messages[i].animal + ' says "' +
messages[i].message + '"</p>';
}
// Use the Node API to apply the new innerHTML to the target
target.setHTML(html);
},
failure : function (x,o) {
alert("Async call failed!");
}
}
};
// Attach a click event listener to the button #demo_btn to send the request
Y.one('#demo button').on('click',function (e) {
// Make the call to the server for JSON data
Y.io("../assets/json/json-connect-response.json", callback);
});
});
</script>
</div>
<h2>Use <code>Y.JSON.parse</code> in the <code>success</code> handler</h2>
<p>
Pass the XHR <code>responseText</code> to <code>Y.JSON.parse()</code> and capture the return value. Note that the <code>parse()</code> method can throw a <code>SyntaxError</code> exception, so be sure to wrap the call in a <code>try/catch</code> block.
</p>
<pre class="code prettyprint lang-javascript">Y.io('../assets/json/json-connect-response.json', {
on : {
success : function (tx, r) {
var parsedResponse;
// protected against malformed JSON response
try {
parsedResponse = Y.JSON.parse(r.responseText);
}
catch (e) {
alert("JSON Parse failed!");
return;
}
}
}
});</pre>
<p>
The <code>parse()</code> method returns the native JavaScript object representation of the string data returned from the <a href="http://yuilibrary.com/yui/docs/api/classes/IO.html#method_io"><code>Y.io()</code></a> call. In this case, the data is an array of object literals in this form:
</p>
<pre class="code prettyprint lang-json">[
{ "animal" : "Cat", "message" : "Meow" },
{ "animal" : "Dog", "message" : "Woof" },
{ "animal" : "Cow", "message" : "Moo" },
{ "animal" : "Duck", "message" : "Quack" },
{ "animal" : "Lion", "message" : "Roar" }
]</pre>
<p>
In the <code>success</code> handler we'll simply loop through this array and outputting its contents to the DOM.
</p>
<h2>Complete Example Source</h2>
<pre class="code prettyprint"><div id="demo" class="yui3-skin-sam">
<p>Click the <em>Get Messages</em> button to send the request to the server; the response will be displayed below the button.</p>
<p><button>Get Messages</button></p>
<div id="demo-messages"></div>
</div>
<script>
// Create business logic in a YUI sandbox using the 'io' and 'json' modules
YUI().use("node", "io", "dump", "json-parse", function (Y) {
// capture the node that we'll display the messages in
var target = Y.one('#demo-messages');
// Create the io callback/configuration
var callback = {
timeout : 3000,
on : {
success : function (x,o) {
Y.log("RAW JSON DATA: " + o.responseText);
var messages = [],
html = '', i, l;
// Process the JSON data returned from the server
try {
messages = Y.JSON.parse(o.responseText);
}
catch (e) {
alert("JSON Parse failed!");
return;
}
Y.log("PARSED DATA: " + Y.Lang.dump(messages));
// The returned data was parsed into an array of objects.
// Add a P element for each received message
for (i=0, l=messages.length; i < l; ++i) {
html += '<p>' + messages[i].animal + ' says "' +
messages[i].message + '"</p>';
}
// Use the Node API to apply the new innerHTML to the target
target.setHTML(html);
},
failure : function (x,o) {
alert("Async call failed!");
}
}
};
// Attach a click event listener to the button #demo_btn to send the request
Y.one('#demo button').on('click',function (e) {
// Make the call to the server for JSON data
Y.io("../assets/json/json-connect-response.json", callback);
});
});
</script></pre>
</div>
</div>
</div>
<div class="yui3-u-1-4">
<div class="sidebar">
<div class="sidebox">
<div class="hd">
<h2 class="no-toc">Examples</h2>
</div>
<div class="bd">
<ul class="examples">
<li data-description="Use JSON to parse data received via XMLHttpRequest via Y.io calls — a simple JSON use case.">
<a href="json-connect.html">JSON with Y.io</a>
</li>
<li data-description="Use the replacer and reviver parameters to reconstitute object instances that have been serialized to JSON.">
<a href="json-freeze-thaw.html">Rebuilding Class Instances from JSON Data</a>
</li>
<li data-description="Use a currency conversion calculation to add a new price member to a JSON response, demonstrating how JSON data, once retrieved, can be transformed during parsing.">
<a href="json-convert-values.html">Adding New Object Members During Parsing</a>
</li>
</ul>
</div>
</div>
<div class="sidebox">
<div class="hd">
<h2 class="no-toc">Examples That Use This Component</h2>
</div>
<div class="bd">
<ul class="examples">
<li data-description="A basic todo list built with the Model, Model List, and View components.">
<a href="../app/app-todo.html">Todo List</a>
</li>
<li data-description="Portal style example using Drag & Drop Event Bubbling and Animation.">
<a href="../dd/portal-drag.html">Portal Style Example</a>
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</div>
<script src="../assets/vendor/prettify/prettify-min.js"></script>
<script>prettyPrint();</script>
<script>
YUI.Env.Tests = {
examples: [],
project: '../assets',
assets: '../assets/json',
name: 'json-connect',
title: 'JSON with Y.io',
newWindow: '',
auto: false
};
YUI.Env.Tests.examples.push('json-connect');
YUI.Env.Tests.examples.push('json-freeze-thaw');
YUI.Env.Tests.examples.push('json-convert-values');
YUI.Env.Tests.examples.push('app-todo');
YUI.Env.Tests.examples.push('portal-drag');
</script>
<script src="../assets/yui/test-runner.js"></script>
</body>
</html>