ejson/tutorial_001_Read.html
2014-10-18 09:19:59 +02:00

292 lines
20 KiB
HTML

<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<title>ejson Library</title>
<link rel="stylesheet" href="base.css">
<link rel="stylesheet" href="menu.css">
</head>
<body>
<div class="navbar navbar-fixed-top">
<div class="container">
<h1><a href="index.html">ejson library</a></h1>
<h4><a href="http://github.com/heeroyui/ejson/">&nbsp;&nbsp;&nbsp;[ sources ]</a></h4>
<h3>API:</h3> <div id="menu">
<ul class="niveau1">
<li><a href="namespace_ejson.html">ejson</a>
</li>
</ul>
</div>
<h3>Tutorials:</h3><div id="menu">
<ul class="niveau1"><li><a href="tutorial_000_Build.html">Build</a></li>
</ul><ul class="niveau1"><li><a href="tutorial_001_Read.html">Read</a></li>
</ul><ul class="niveau1"><li><a href="tutorial_002_Write.html">Write</a></li>
</ul></div>
<br/><h3>Associate libraries:</h3><div id="menu">
<ul class="niveau1"><li><a href="../ewol/index.html">ewol</a></li>
</ul><ul class="niveau1"><li><a href="../egami/index.html">egami</a></li>
</ul><ul class="niveau1"><li><a href="../ege/index.html">ege</a></li>
</ul><ul class="niveau1"><li><a href="../esvg/index.html">esvg</a></li>
</ul><ul class="niveau1"><li><a href="../etk/index.html">etk</a></li>
</ul><ul class="niveau1"><li><a href="../exml/index.html">exml</a></li>
</ul></div>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
</div>
</div>
<div class="container" id="content">
<h1><center>read</center></h1>
<hr><div align="left"><a href="tutorial_000_Build.html">Previous: Build</a></div> <div align="right"><a href="tutorial_002_Write.html">Next: Write</a></div>
<h1><center>Read a json file</center></h1>
<hr><div align="left"><a href="tutorial_000_Build.html">Previous: Build example</a></div> <div align="right"><a href="tutorial_002_Write.html">Next: Write a file</a></div><br/>
A json file is like a xml, but in a simplest way.
It is in the minimum constituated of:
<pre>
{}
</pre>
This is the simplest json code.<br/>
for example we will use the next json file :
<pre>
{
"element1":25622.53,
"element2":"a string...",
"is active":false,
"NULL element":null,
"exampleObject":{
"a string":"my super example of string",
"a null element":null,
"an array element":[
12, 25, 65, 654
],
"a boolean Element":true,
"a simple sumber"=156156.343,
"an other object":{
"plop": 1,
"plop2": 2
}
},
"exampleArray":[
12,
25,
65,
654,
{
"plup": true,
"plup2": false
},
true,
null,
[ 22, 23, 24, 25]
}
}
</pre><br/>
<br/>
<h1> Open the file </h1><br/>
The first step to open a file is to create the json document:<br/>
<pre>
<span class="code-preproc">#include &lt;ejson/ejson.h&gt;
</span>
<span class="code-type">int</span> <span class="code-function-name">main(</span>) <span class="code-operator">{</span>
<span class="code-comment">// declare document
</span> <span class="code-class">ejson::Document</span> doc;
...
<span class="code-operator">}</span>
</pre><br/>
<h2> Load a stored file </h2><br/>
It is important to remember that the input file is manage by etk,
then the naming form is describe by the class: <a href="class_etk__FSNode.html">etk::FSNode</a><br/>
<pre>
<span class="code-comment">// read file
</span> <span class="code-keyword">if </span>(doc.<span class="code-function-name">load(</span><span class="code-text-quote">"DATA:example.json"</span>) <span class="code-operator">==</span> <span class="<code-operator">false</span>) <span class="code-operator">{</span>
<span class="code-function-name">APPL_ERROR(</span><span class="code-text-quote">"An error occured when reading the file..."</span>);
<span class="code-comment">// TODO : STANDARDIZE ERROR....
</span> <span class="code-keyword">return </span>-<span class="code-number">1</span>;
<span class="code-operator">}</span>
</pre><br/>
<h2> Load a file stored in memory </h2><br/>
This step is easyest has a reading in a file.<br/>
In the first step, declare a string containing the json description:
<pre>
std:string myJson = <span class="code-text-quote">"{ \"element1\":25622.53, \"element2\":\"a string...\" }"</span>;
</pre><br/>
Now we just need to load the string:
<pre>
<span class="code-keyword">if </span>(doc.<span class="code-function-name">parse(</span>myJson) <span class="code-operator">==</span> <span class="<code-operator">false</span>) <span class="code-operator">{</span>
<span class="code-function-name">APPL_ERROR(</span><span class="code-text-quote">"An error occured when parsing the string"</span>);
<span class="code-keyword">return </span>-<span class="code-number">1</span>;
<span class="code-operator">}</span>
</pre><br/>
it could be interesting to add some \n in the string to find some error in the json string<br/>
<h1> Access on the data </h1><br/>
now we have the data stored in the doc instance, it could be interesting to access on it.<br/>
Despite of XML interface that is not designed to be keep in memory but just parsed and drop,
the json element is many time use as a simple interface to acces on the data.<br/>
This is the reason for this json interfce is designed for simple acces and use.<br/>
<h2> The simple way </h2><br/>
Read a number value in the doc:
<pre>
<span class="code-type">double</span> myValue = doc.<span class="code-function-name">getNumberValue(</span><span class="code-text-quote">"element1"</span>, <span class="code-number">49</span>);
<span class="code-function-name">APPL_INFO(</span><span class="code-text-quote">"Get the element value:"</span> &lt;&lt; myValue);
</pre>
Note that we had a return value, in case of the element is not present or in the wrong form.<br/>
We have the same interface for boolean, string and number:
<ul><li> ejson::Object::getNumberValue</li><li> ejson::Object::getStringValue</li><li> ejson::Object::getBooleanValue</li></ul>
These interface methode are availlable for <a href="class_ejson__Document.html">ejson::Document</a>, <a href="class_ejson__Object.html">ejson::Object</a>.
The similar interface are availlable on <a href="class_ejson_Array.html">ejson:Array</a>:
<ul><li> ejson::Array::getNumberValue</li><li> ejson::Array::getStringValue</li><li> ejson::Array::getBooleanValue</li></ul>
It could be interesting to remember that the maain node of a json file in an object,
this is the reason that <a href="class_ejson__Document.html">ejson::Document</a> herited of <a href="class_ejson__Object.html">ejson::Object</a>.<br/>
<h2> The generic way </h2><br/>
The classical way to read a json file is to parse it like a xml:<br/>
<h3> Object </h3>
We are now reading all node in an object:
<pre>
<span class="code-class">ejson::Object</span>* obj = doc.<span class="code-function-name">getObject(</span><span class="code-text-quote">"exampleObject"</span>);
<span class="code-comment">// note that the obj is NULL if it not an "Object"
</span> <span class="code-keyword">if </span>(obj <span class="code-operator">==</span> <span class="code-generic-define">NULL</span>) <span class="code-operator">{</span>
<span class="code-function-name">APPL_ERROR(</span><span class="code-text-quote">"Can not get the object 'exampleObject' in the json file"</span>);
<span class="code-keyword">return </span>-<span class="code-number">1</span>;
<span class="code-operator">}</span>
</pre>
Note at this point we can parse an object in 2 way:<br/>
1: The fastest but not the best:
<pre>
<span class="code-keyword">for </span>(<span class="code-type">size_t</span> iii=<span class="code-number">0</span>; iii &lt; obj-&gt;<span class="code-function-name">size(</span>); ++iii) <span class="code-operator">{</span>
<span class="code-class">std::string</span> key = obj-&gt;<span class="code-function-name">getKey(</span>iii);
<span class="code-class">ejson::Value</span>* val = obj[iii];
<span class="code-comment">// note that error can appear, then check result...
</span> <span class="code-keyword">if </span>(val <span class="code-operator">==</span> <span class="code-generic-define">NULL</span>) <span class="code-operator">{</span>
<span class="code-function-name">APPL_ERROR(</span><span class="code-text-quote">"Can not read the object id="</span> &lt;&lt; iii);
continue;
<span class="code-operator">}</span>
<span class="code-keyword">switch(</span>val-&gt;<span class="code-function-name">getType(</span>)) <span class="code-operator">{</span>
<span class="code-keyword">case </span>typeArray: <span class="code-operator">{</span>
<span class="code-class">ejson::Array</span>* myArray = val-&gt;<span class="code-function-name">toArray(</span>);
<span class="code-function-name">APPL_INFO(</span><span class="code-text-quote">"Find an Array @"</span> &lt;&lt; key);
<span class="code-operator">}</span> break;
<span class="code-keyword">case </span>typeString: <span class="code-operator">{</span>
<span class="code-class">ejson::String</span>* myString = val-&gt;<span class="code-function-name">toString(</span>);
<span class="code-function-name">APPL_INFO(</span><span class="code-text-quote">"Find a String @"</span> &lt;&lt; key &lt;&lt; <span class="code-text-quote">" value='"</span> &lt;&lt; myString-&gt;<span class="code-function-name">get(</span>) &lt;&lt; <span class="code-text-quote">"'"</span>);
<span class="code-operator">}</span> break;
<span class="code-keyword">case </span>typeNumber: <span class="code-operator">{</span>
<span class="code-class">ejson::Number</span>* myNumber = val-&gt;<span class="code-function-name">toNumber(</span>);
<span class="code-function-name">APPL_INFO(</span><span class="code-text-quote">"Find a Number @"</span> &lt;&lt; key &lt;&lt; <span class="code-text-quote">" value='"</span> &lt;&lt; myNumber-&gt;<span class="code-function-name">get(</span>) &lt;&lt; <span class="code-text-quote">"'"</span>);
<span class="code-operator">}</span> break;
<span class="code-keyword">case </span>typeBoolean: <span class="code-operator">{</span>
<span class="code-class">ejson::Boolean</span>* myBoolean = val-&gt;<span class="code-function-name">toBoolean(</span>);
<span class="code-function-name">APPL_INFO(</span><span class="code-text-quote">"Find a Boolean @"</span> &lt;&lt; key &lt;&lt; <span class="code-text-quote">" value='"</span> &lt;&lt; myBoolean-&gt;<span class="code-function-name">get(</span>) &lt;&lt; <span class="code-text-quote">"'"</span>);
<span class="code-operator">}</span> break;
<span class="code-keyword">case </span>typeNull:
<span class="code-function-name">APPL_INFO(</span><span class="code-text-quote">"Find a null @"</span> &lt;&lt; key);
break;
<span class="code-keyword">case </span>typeObject: <span class="code-operator">{</span>
<span class="code-class">ejson::Object</span>* myObject = val-&gt;<span class="code-function-name">toObject(</span>);
<span class="code-function-name">APPL_INFO(</span><span class="code-text-quote">"Find an Object @"</span> &lt;&lt; key);
<span class="code-operator">}</span> break;
<span class="code-operator">}</span>
<span class="code-operator">}</span>
</pre><br/>
2: A more generic way to acces on the elemnts:
<pre>
<span class="code-class">stk::vector</span>&lt;<span class="code-class">std::string</span>&gt; keys = obj-&gt;<span class="code-function-name">getKeys(</span>);
<span class="code-keyword">for </span>(<span class="code-storage-keyword">auto</span> key in keys) <span class="code-operator">{</span>
<span class="code-class">ejson::Value</span>* val = obj[key];
<span class="code-comment">// note that error can appear, then check result...
</span> <span class="code-keyword">if </span>(val <span class="code-operator">==</span> <span class="code-generic-define">NULL</span>) <span class="code-operator">{</span>
<span class="code-function-name">APPL_ERROR(</span><span class="code-text-quote">"Can not read the object key="</span> &lt;&lt; key);
continue;
<span class="code-operator">}</span>
<span class="code-keyword">switch(</span>val-&gt;<span class="code-function-name">getType(</span>)) <span class="code-operator">{</span>
<span class="code-keyword">case </span>typeArray: <span class="code-operator">{</span>
<span class="code-class">ejson::Array</span>* myArray = val-&gt;<span class="code-function-name">toArray(</span>);
<span class="code-function-name">APPL_INFO(</span><span class="code-text-quote">"Find an Array @"</span> &lt;&lt; key);
<span class="code-operator">}</span> break;
<span class="code-keyword">case </span>typeString: <span class="code-operator">{</span>
<span class="code-class">ejson::String</span>* myString = val-&gt;<span class="code-function-name">toString(</span>);
<span class="code-function-name">APPL_INFO(</span><span class="code-text-quote">"Find a String @"</span> &lt;&lt; key &lt;&lt; <span class="code-text-quote">" value='"</span> &lt;&lt; myString-&gt;<span class="code-function-name">get(</span>) &lt;&lt; <span class="code-text-quote">"'"</span>);
<span class="code-operator">}</span> break;
<span class="code-keyword">case </span>typeNumber: <span class="code-operator">{</span>
<span class="code-class">ejson::Number</span>* myNumber = val-&gt;<span class="code-function-name">toNumber(</span>);
<span class="code-function-name">APPL_INFO(</span><span class="code-text-quote">"Find a Number @"</span> &lt;&lt; key &lt;&lt; <span class="code-text-quote">" value='"</span> &lt;&lt; myNumber-&gt;<span class="code-function-name">get(</span>) &lt;&lt; <span class="code-text-quote">"'"</span>);
<span class="code-operator">}</span> break;
<span class="code-keyword">case </span>typeBoolean: <span class="code-operator">{</span>
<span class="code-class">ejson::Boolean</span>* myBoolean = val-&gt;<span class="code-function-name">toBoolean(</span>);
<span class="code-function-name">APPL_INFO(</span><span class="code-text-quote">"Find a Boolean @"</span> &lt;&lt; key &lt;&lt; <span class="code-text-quote">" value='"</span> &lt;&lt; myBoolean-&gt;<span class="code-function-name">get(</span>) &lt;&lt; <span class="code-text-quote">"'"</span>);
<span class="code-operator">}</span> break;
<span class="code-keyword">case </span>typeNull:
<span class="code-function-name">APPL_INFO(</span><span class="code-text-quote">"Find a null @"</span> &lt;&lt; key);
break;
<span class="code-keyword">case </span>typeObject: <span class="code-operator">{</span>
<span class="code-class">ejson::Object</span>* myObject = val-&gt;<span class="code-function-name">toObject(</span>);
<span class="code-function-name">APPL_INFO(</span><span class="code-text-quote">"Find an Object @"</span> &lt;&lt; key);
<span class="code-operator">}</span> break;
<span class="code-operator">}</span>
<span class="code-operator">}</span>
</pre><br/>
<h3> Array </h3><br/>
We are now reading all node in an Array:
<pre>
<span class="code-class">ejson::Array</span>* obj = doc.<span class="code-function-name">getArray(</span><span class="code-text-quote">"exampleArray"</span>);
<span class="code-comment">// note that the obj is NULL if it not an "Array"
</span> <span class="code-keyword">if </span>(obj <span class="code-operator">==</span> <span class="code-generic-define">NULL</span>) <span class="code-operator">{</span>
<span class="code-function-name">APPL_ERROR(</span><span class="code-text-quote">"Can not get the array 'exampleArray' in the json file"</span>);
<span class="code-keyword">return </span>-<span class="code-number">1</span>;
<span class="code-operator">}</span>
</pre><br/>
Note for an array we have only one methode to parse the data :<br/>
<pre>
<span class="code-keyword">for </span>(<span class="code-type">size_t</span> iii=<span class="code-number">0</span>; iii &lt; obj-&gt;<span class="code-function-name">size(</span>); ++iii) <span class="code-operator">{</span>
<span class="code-class">ejson::Value</span>* val = obj[iii];
<span class="code-comment">// or ejson::Value* val = obj-&gt;get(iii);
</span> <span class="code-comment">// note that error can appear, then check result...
</span> <span class="code-keyword">if </span>(val <span class="code-operator">==</span> <span class="code-generic-define">NULL</span>) <span class="code-operator">{</span>
<span class="code-function-name">APPL_ERROR(</span><span class="code-text-quote">"Can not read the object id="</span> &lt;&lt; iii);
continue;
<span class="code-operator">}</span>
<span class="code-keyword">switch(</span>val-&gt;<span class="code-function-name">getType(</span>)) <span class="code-operator">{</span>
<span class="code-keyword">case </span>typeArray: <span class="code-operator">{</span>
<span class="code-class">ejson::Array</span>* myArray = val-&gt;<span class="code-function-name">toArray(</span>);
<span class="code-function-name">APPL_INFO(</span><span class="code-text-quote">"Find an Array @"</span> &lt;&lt; key);
<span class="code-operator">}</span> break;
<span class="code-keyword">case </span>typeString: <span class="code-operator">{</span>
<span class="code-class">ejson::String</span>* myString = val-&gt;<span class="code-function-name">toString(</span>);
<span class="code-function-name">APPL_INFO(</span><span class="code-text-quote">"Find a String @"</span> &lt;&lt; key &lt;&lt; <span class="code-text-quote">" value='"</span> &lt;&lt; myString-&gt;<span class="code-function-name">get(</span>) &lt;&lt; <span class="code-text-quote">"'"</span>);
<span class="code-operator">}</span> break;
<span class="code-keyword">case </span>typeNumber: <span class="code-operator">{</span>
<span class="code-class">ejson::Number</span>* myNumber = val-&gt;<span class="code-function-name">toNumber(</span>);
<span class="code-function-name">APPL_INFO(</span><span class="code-text-quote">"Find a Number @"</span> &lt;&lt; key &lt;&lt; <span class="code-text-quote">" value='"</span> &lt;&lt; myNumber-&gt;<span class="code-function-name">get(</span>) &lt;&lt; <span class="code-text-quote">"'"</span>);
<span class="code-operator">}</span> break;
<span class="code-keyword">case </span>typeBoolean: <span class="code-operator">{</span>
<span class="code-class">ejson::Boolean</span>* myBoolean = val-&gt;<span class="code-function-name">toBoolean(</span>);
<span class="code-function-name">APPL_INFO(</span><span class="code-text-quote">"Find a Boolean @"</span> &lt;&lt; key &lt;&lt; <span class="code-text-quote">" value='"</span> &lt;&lt; myBoolean-&gt;<span class="code-function-name">get(</span>) &lt;&lt; <span class="code-text-quote">"'"</span>);
<span class="code-operator">}</span> break;
<span class="code-keyword">case </span>typeNull:
<span class="code-function-name">APPL_INFO(</span><span class="code-text-quote">"Find a null @"</span> &lt;&lt; key);
break;
<span class="code-keyword">case </span>typeObject: <span class="code-operator">{</span>
<span class="code-class">ejson::Object</span>* myObject = val-&gt;<span class="code-function-name">toObject(</span>);
<span class="code-function-name">APPL_INFO(</span><span class="code-text-quote">"Find an Object @"</span> &lt;&lt; key);
<span class="code-operator">}</span> break;
<span class="code-operator">}</span>
<span class="code-operator">}</span>
</pre><br/>
It is important to note that many time the user know what type will appear in a list or in an object , then you can directly use:
<ul><li> ejson::Array::getNumber</li><li> ejson::Array::getNull</li><li> ejson::Array::getArray</li><li> ejson::Array::getObject</li><li> ejson::Array::getBoolean</li><li> ejson::Array::getstring</li></ul>These fuction automatly cast the resut in the good form (if it is the real one)<br/>
</div>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-46753803-1', 'heeroyui.github.io');
ga('send', 'pageview');
</script>
</body>
</html>