supperobjectreadme.html 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. <html>
  2. <head>
  3. <style type="text/css">
  4. <!--
  5. pre#excode {
  6. background-color:#FFFFFF;
  7. border:1px dashed #000000;
  8. font-family:'courier new';
  9. font-size:8pt;
  10. padding:8px;
  11. }
  12. span#lit {
  13. color:#0000FF;
  14. }
  15. span#keyw {
  16. color:#000000;
  17. font-weight:bold;
  18. }
  19. span#cmt {
  20. color:#008000;
  21. }
  22. span#dtyp {
  23. color:#2B91AF;
  24. }
  25. --> </style>
  26. </head>
  27. <body bgcolor="#D4D0C8">
  28. <h1>SuperObject</h1>
  29. <h3>What is JSON ?</h3>
  30. <p>
  31. JSON (JavaScript Object Notation) is a lightweight data-interchange format.<br>
  32. It is easy for humans to read and write. <br>
  33. It is easy for machines to parse and generate. <br>
  34. It is based on a subset of the JavaScript Programming Language,
  35. Standard ECMA-262 3rd Edition - December 1999. <br>
  36. JSON is a text format that is
  37. completely language independent but uses conventions that are familiar to programmers.<br>
  38. These properties make JSON an ideal data-interchange language.<br>
  39. You can get more informations on <a href="http://www.json.org">json.org</a>.
  40. <pre id="exCode">
  41. {
  42. "name": <span id="lit">"Henri Gourvest"</span>, <span id="cmt">/* this is a comment */</span>
  43. "vip": true,
  44. "telephones": [<span id="lit">"000000000"</span>, <span id="lit">"111111111111"</span>],
  45. "age": 33,
  46. "size": 1.83,
  47. "adresses": [
  48. {
  49. "adress": <span id="lit">"blabla"</span>,
  50. "city": <span id="lit">"Metz"</span>,
  51. "pc": 57000
  52. },
  53. {
  54. "adress": <span id="lit">"blabla"</span>,
  55. "city": <span id="lit">"Nantes"</span>,
  56. "pc": 44000
  57. }
  58. ]
  59. }
  60. </pre>
  61. <h3>Parsing a JSON data structure</h3>
  62. <pre id="exCode">
  63. <span id="keyw">var</span>
  64. obj: ISuperObject;
  65. <span id="keyw">begin</span>
  66. obj := SO(<span id="lit">'{"foo": true}'</span>);
  67. obj := TSuperObject.ParseString(<span id="lit">'{"foo": true}'</span>);
  68. obj := TSuperObject.ParseStream(stream);
  69. obj := TSuperObject.ParseFile(FileName);
  70. <span id="keyw">end;</span>
  71. </pre>
  72. <h3>Accessing data</h3>
  73. <p>
  74. There isn't individual datastructure for each supported data types.<br>
  75. They are all an object: the <b>ISuperObject</b>.
  76. </p>
  77. <pre id="exCode">
  78. val := obj.AsString;
  79. val := obj.AsInteger;
  80. val := obj.AsBoolean;
  81. val := obj.AsDouble;
  82. val := obj.AsArray;
  83. val := obj.AsObject;
  84. val := obj.AsMethod;
  85. </pre>
  86. <h4>How to read a property value of an object ?</h4>
  87. <pre id="exCode">
  88. val := obj.AsObject.S[<span id="lit">'foo'</span>]; <span id="cmt">// get a string</span>
  89. val := obj.AsObject.I[<span id="lit">'foo'</span>]; <span id="cmt">// get an Int64</span>
  90. val := obj.AsObject.B[<span id="lit">'foo'</span>]; <span id="cmt">// get a Boolean</span>
  91. val := obj.AsObject.D[<span id="lit">'foo'</span>]; <span id="cmt">// get a Double</span>
  92. val := obj.AsObject.O[<span id="lit">'foo'</span>]; <span id="cmt">// get an Object (default)</span>
  93. val := obj.AsObject.M[<span id="lit">'foo'</span>]; <span id="cmt">// get a Method</span>
  94. val := obj.AsObject.N[<span id="lit">'foo'</span>]; <span id="cmt">// get a null object</span>
  95. </pre>
  96. <h4>How to read a value from an array ?</h4>
  97. <pre id="exCode">
  98. <span id="cmt">// the advanced way</span>
  99. val := obj.AsArray.S[0]; <span id="cmt">// get a string</span>
  100. val := obj.AsArray.I[0]; <span id="cmt">// get an Int64</span>
  101. val := obj.AsArray.B[0]; <span id="cmt">// get a Boolean</span>
  102. val := obj.AsArray.D[0]; <span id="cmt">// get a Double</span>
  103. val := obj.AsArray.O[0]; <span id="cmt">// get an Object (default)</span>
  104. val := obj.AsArray.M[0]; <span id="cmt">// get a Method</span>
  105. val := obj.AsArray.N[0]; <span id="cmt">// get a null object</span>
  106. </pre>
  107. <h4>Using paths</h4>
  108. <p>Using paths is a <b>very productive</b> method to find an object when you know where is it.<br>
  109. This is some usage cases:
  110. </p>
  111. <pre id="exCode">
  112. obj[<span id="lit">'foo'</span>]; <span id="cmt">// get a property</span>
  113. obj[<span id="lit">'123'</span>]; <span id="cmt">// get an item array</span>
  114. obj[<span id="lit">'foo.list'</span>]; <span id="cmt">// get a property from an object</span>
  115. obj[<span id="lit">'foo[123]'</span>]; <span id="cmt">// get an item array from an object</span>
  116. obj[<span id="lit">'foo(1,2,3)'</span>]; <span id="cmt">// call a method</span>
  117. obj[<span id="lit">'foo[]'</span>] := value; <span id="cmt">// add an item array</span>
  118. </pre>
  119. <p>you also can encapsulate paths:</p>
  120. <pre id="exCode">
  121. obj := so(<span id="lit">'{"index": 1, "items": ["item 1", "item 2", "item 3"]}'</span>);
  122. obj[<span id="lit">'items[index]'</span>] <span id="cmt">// return "item 2"</span>
  123. </pre>
  124. <p>or recreate a new data structure from another:</p>
  125. <pre id="exCode">
  126. obj := so(<span id="lit">'{"index": 1, "items": ["item 1", "item 2", "item 3"]}'</span>);
  127. obj[<span id="lit">'{"item": items[index], "index": index}'</span>] <span id="cmt">// return {"item": "item 2", "index": 1}</span>
  128. </pre>
  129. <h3>Browsing data structure</h3>
  130. <h4>Using Delphi enumerator.</h4>
  131. <p>Using Delphi enumerator you can browse item's array or property's object value in the same maner.</p>
  132. <pre id="exCode">
  133. <span id="keyw">var</span>
  134. item: ISuperObject;
  135. <span id="keyw">begin</span>
  136. <span id="keyw">for</span> item <span id="keyw">in</span> obj[<span id="lit">'items'</span>] <span id="keyw">do</span> ...
  137. </pre>
  138. <p>you can also browse the keys and values of an object like this:</p>
  139. <pre id="exCode">
  140. <span id="keyw">var</span>
  141. item: TSuperAvlEntry;
  142. <span id="keyw">begin</span>
  143. <span id="keyw">for</span> item <span id="keyw">in</span> obj.AsObject <span id="keyw">do</span> ...
  144. <span id="keyw">begin</span>
  145. item.Name;
  146. item.Value;
  147. <span id="keyw">end</span>;
  148. </pre>
  149. <h4>Browsing object properties without enumerator</h4>
  150. <pre id="exCode">
  151. <span id="keyw">var</span>
  152. item: TSuperObjectIter;
  153. <span id="keyw">begin</span>
  154. <span id="keyw">if</span> ObjectFindFirst(obj, item) <span id="keyw">then</span>
  155. <span id="keyw">repeat</span>
  156. item.key;
  157. item.val;
  158. <span id="keyw">until</span> <span id="keyw">not</span> ObjectFindNext(item);
  159. ObjectFindClose(item);
  160. </pre>
  161. <h4>Browsing array items without enumerator</h4>
  162. <pre id="exCode">
  163. <span id="keyw">var</span>
  164. item: Integer;
  165. <span id="keyw">begin</span>
  166. <span id="keyw">for</span> item := 0 <span id="keyw">to</span> obj.AsArray.Length - 1 <span id="keyw">do</span>
  167. obj.AsArray[item]
  168. </pre>
  169. <h3>Saving data</h3>
  170. <pre id="exCode">
  171. obj.AsJSon(options);
  172. obj.SaveTo(stream);
  173. obj.SaveTo(filename);
  174. </pre>
  175. <h3>Helpers</h3>
  176. <pre id="exCode">
  177. SO([<span id="lit">'prop1'</span>, true, <span id="lit">'prop2'</span>, 123]); <span id="cmt">// return an object {"prop1": true, "prop2": 123}</span>
  178. SA([true, 123]); <span id="cmt">// return an array [true, 123]</span>
  179. </pre>
  180. <h3>Non canonical forms</h3>
  181. The SuperObject is able to parse non canonical forms.
  182. <pre id="exCode">
  183. <span id="cmt">// unquoted identifiers</span>
  184. SO(<span id="lit">'{foo: true}'</span>);
  185. <span id="cmt">// unescaped or unquoted strings</span>
  186. SO(<span id="lit">'{собственность: bla bla bla}'</span>);
  187. <span id="cmt">// excadecimal</span>
  188. SO(<span id="lit">'{foo: \xFF}'</span>);
  189. </pre>
  190. </body>
  191. </html>