292 lines
20 KiB
HTML
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/"> [ 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 <ejson/ejson.h>
|
|
</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> << 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 < obj-><span class="code-function-name">size(</span>); ++iii) <span class="code-operator">{</span>
|
|
<span class="code-class">std::string</span> key = obj-><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> << iii);
|
|
continue;
|
|
<span class="code-operator">}</span>
|
|
<span class="code-keyword">switch(</span>val-><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-><span class="code-function-name">toArray(</span>);
|
|
<span class="code-function-name">APPL_INFO(</span><span class="code-text-quote">"Find an Array @"</span> << 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-><span class="code-function-name">toString(</span>);
|
|
<span class="code-function-name">APPL_INFO(</span><span class="code-text-quote">"Find a String @"</span> << key << <span class="code-text-quote">" value='"</span> << myString-><span class="code-function-name">get(</span>) << <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-><span class="code-function-name">toNumber(</span>);
|
|
<span class="code-function-name">APPL_INFO(</span><span class="code-text-quote">"Find a Number @"</span> << key << <span class="code-text-quote">" value='"</span> << myNumber-><span class="code-function-name">get(</span>) << <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-><span class="code-function-name">toBoolean(</span>);
|
|
<span class="code-function-name">APPL_INFO(</span><span class="code-text-quote">"Find a Boolean @"</span> << key << <span class="code-text-quote">" value='"</span> << myBoolean-><span class="code-function-name">get(</span>) << <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> << key);
|
|
break;
|
|
<span class="code-keyword">case </span>typeObject: <span class="code-operator">{</span>
|
|
<span class="code-class">ejson::Object</span>* myObject = val-><span class="code-function-name">toObject(</span>);
|
|
<span class="code-function-name">APPL_INFO(</span><span class="code-text-quote">"Find an Object @"</span> << 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><<span class="code-class">std::string</span>> keys = obj-><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> << key);
|
|
continue;
|
|
<span class="code-operator">}</span>
|
|
<span class="code-keyword">switch(</span>val-><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-><span class="code-function-name">toArray(</span>);
|
|
<span class="code-function-name">APPL_INFO(</span><span class="code-text-quote">"Find an Array @"</span> << 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-><span class="code-function-name">toString(</span>);
|
|
<span class="code-function-name">APPL_INFO(</span><span class="code-text-quote">"Find a String @"</span> << key << <span class="code-text-quote">" value='"</span> << myString-><span class="code-function-name">get(</span>) << <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-><span class="code-function-name">toNumber(</span>);
|
|
<span class="code-function-name">APPL_INFO(</span><span class="code-text-quote">"Find a Number @"</span> << key << <span class="code-text-quote">" value='"</span> << myNumber-><span class="code-function-name">get(</span>) << <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-><span class="code-function-name">toBoolean(</span>);
|
|
<span class="code-function-name">APPL_INFO(</span><span class="code-text-quote">"Find a Boolean @"</span> << key << <span class="code-text-quote">" value='"</span> << myBoolean-><span class="code-function-name">get(</span>) << <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> << key);
|
|
break;
|
|
<span class="code-keyword">case </span>typeObject: <span class="code-operator">{</span>
|
|
<span class="code-class">ejson::Object</span>* myObject = val-><span class="code-function-name">toObject(</span>);
|
|
<span class="code-function-name">APPL_INFO(</span><span class="code-text-quote">"Find an Object @"</span> << 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 < obj-><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->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> << iii);
|
|
continue;
|
|
<span class="code-operator">}</span>
|
|
<span class="code-keyword">switch(</span>val-><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-><span class="code-function-name">toArray(</span>);
|
|
<span class="code-function-name">APPL_INFO(</span><span class="code-text-quote">"Find an Array @"</span> << 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-><span class="code-function-name">toString(</span>);
|
|
<span class="code-function-name">APPL_INFO(</span><span class="code-text-quote">"Find a String @"</span> << key << <span class="code-text-quote">" value='"</span> << myString-><span class="code-function-name">get(</span>) << <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-><span class="code-function-name">toNumber(</span>);
|
|
<span class="code-function-name">APPL_INFO(</span><span class="code-text-quote">"Find a Number @"</span> << key << <span class="code-text-quote">" value='"</span> << myNumber-><span class="code-function-name">get(</span>) << <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-><span class="code-function-name">toBoolean(</span>);
|
|
<span class="code-function-name">APPL_INFO(</span><span class="code-text-quote">"Find a Boolean @"</span> << key << <span class="code-text-quote">" value='"</span> << myBoolean-><span class="code-function-name">get(</span>) << <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> << key);
|
|
break;
|
|
<span class="code-keyword">case </span>typeObject: <span class="code-operator">{</span>
|
|
<span class="code-class">ejson::Object</span>* myObject = val-><span class="code-function-name">toObject(</span>);
|
|
<span class="code-function-name">APPL_INFO(</span><span class="code-text-quote">"Find an Object @"</span> << 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>
|