Actionscript JSON


/ Published in: ActionScript 3
Save to your folder(s)



Copy this code and paste it in your HTML
  1. package com {
  2.  
  3.  
  4.  
  5. public class JSON {
  6.  
  7.  
  8.  
  9. // ----o Public Methods
  10.  
  11.  
  12.  
  13. static public function deserialize(source:String):* {
  14.  
  15.  
  16.  
  17. source = new String(source) ; // Speed
  18.  
  19. var at:Number = 0 ;
  20.  
  21. var ch:String = ' ';
  22.  
  23.  
  24.  
  25. var _isDigit:Function ;
  26.  
  27. var _isHexDigit:Function ;
  28.  
  29. var _white:Function ;
  30.  
  31. var _string:Function ;
  32.  
  33. var _next:Function ;
  34.  
  35. var _array:Function ;
  36.  
  37. var _object:Function ;
  38.  
  39. var _number:Function ;
  40.  
  41. var _word:Function ;
  42.  
  43. var _value:Function ;
  44.  
  45. var _error:Function ;
  46.  
  47.  
  48.  
  49. _isDigit = function( /*Char*/ c:String ):* {
  50.  
  51. return( ("0" <= c) && (c <= "9") );
  52.  
  53. } ;
  54.  
  55.  
  56.  
  57. _isHexDigit = function( /*Char*/ c:String ):* {
  58.  
  59. return( _isDigit( c ) || (("A" <= c) && (c <= "F")) || (("a" <= c) && (c <= "f")) );
  60.  
  61. } ;
  62.  
  63.  
  64.  
  65. _error = function(m:String):void {
  66.  
  67. //throw new JSONError( m, at - 1 , source) ;
  68.  
  69. throw new Error(m, at-1);
  70.  
  71. } ;
  72.  
  73.  
  74.  
  75. _next = function():* {
  76.  
  77. ch = source.charAt(at);
  78.  
  79. at += 1;
  80.  
  81. return ch;
  82.  
  83. } ;
  84.  
  85.  
  86.  
  87. _white = function ():void {
  88.  
  89. while (ch) {
  90.  
  91. if (ch <= ' ') {
  92.  
  93. _next();
  94.  
  95. } else if (ch == '/') {
  96.  
  97. switch (_next()) {
  98.  
  99. case '/':
  100.  
  101. while (_next() && ch != '\n' && ch != '\r') {}
  102.  
  103. break;
  104.  
  105. case '*':
  106.  
  107. _next();
  108.  
  109. for (;;) {
  110.  
  111. if (ch) {
  112.  
  113. if (ch == '*') {
  114.  
  115. if (_next() == '/') {
  116.  
  117. _next();
  118.  
  119. break;
  120.  
  121. }
  122.  
  123. } else {
  124.  
  125. _next();
  126.  
  127. }
  128.  
  129. } else {
  130.  
  131. _error("Unterminated Comment");
  132.  
  133. }
  134.  
  135. }
  136.  
  137. break;
  138.  
  139. default:
  140.  
  141. _error("Syntax Error");
  142.  
  143. }
  144.  
  145. } else {
  146.  
  147. break;
  148.  
  149. }
  150.  
  151. }
  152.  
  153. };
  154.  
  155.  
  156.  
  157. _string = function ():* {
  158.  
  159.  
  160.  
  161. var i:* = '' ;
  162.  
  163. var s:* = '' ;
  164.  
  165. var t:* ;
  166.  
  167. var u:* ;
  168.  
  169. var outer:Boolean = false;
  170.  
  171.  
  172.  
  173. if (ch == '"') {
  174.  
  175.  
  176.  
  177. while (_next()) {
  178.  
  179. if (ch == '"')
  180.  
  181. {
  182.  
  183. _next();
  184.  
  185. return s;
  186.  
  187. }
  188.  
  189. else if (ch == '\\')
  190.  
  191. {
  192.  
  193. switch (_next()) {
  194.  
  195. case 'b':
  196.  
  197. s += '\b';
  198.  
  199. break;
  200.  
  201. case 'f':
  202.  
  203. s += '\f';
  204.  
  205. break;
  206.  
  207. case 'n':
  208.  
  209. s += '\n';
  210.  
  211. break;
  212.  
  213. case 'r':
  214.  
  215. s += '\r';
  216.  
  217. break;
  218.  
  219. case 't':
  220.  
  221. s += '\t';
  222.  
  223. break;
  224.  
  225. case 'u':
  226.  
  227. u = 0;
  228.  
  229. for (i = 0; i < 4; i += 1) {
  230.  
  231. t = parseInt(_next(), 16);
  232.  
  233. if (!isFinite(t)) {
  234.  
  235. outer = true;
  236.  
  237. break;
  238.  
  239. }
  240.  
  241. u = u * 16 + t;
  242.  
  243. }
  244.  
  245. if(outer) {
  246.  
  247. outer = false;
  248.  
  249. break;
  250.  
  251. }
  252.  
  253. s += String.fromCharCode(u);
  254.  
  255. break;
  256.  
  257. default:
  258.  
  259. s += ch;
  260.  
  261. }
  262.  
  263. } else {
  264.  
  265. s += ch;
  266.  
  267. }
  268.  
  269. }
  270.  
  271. }
  272.  
  273. _error("Bad String");
  274.  
  275. return null ;
  276.  
  277. } ;
  278.  
  279.  
  280.  
  281. _array = function():* {
  282.  
  283. var a:Array = [];
  284.  
  285. if (ch == '[') {
  286.  
  287. _next();
  288.  
  289. _white();
  290.  
  291. if (ch == ']') {
  292.  
  293. _next();
  294.  
  295. return a;
  296.  
  297. }
  298.  
  299. while (ch) {
  300.  
  301. a.push(_value());
  302.  
  303. _white();
  304.  
  305. if (ch == ']') {
  306.  
  307. _next();
  308.  
  309. return a;
  310.  
  311. } else if (ch != ',') {
  312.  
  313. break;
  314.  
  315. }
  316.  
  317. _next();
  318.  
  319. _white();
  320.  
  321. }
  322.  
  323. }
  324.  
  325. _error("Bad Array");
  326.  
  327. return null ;
  328.  
  329. };
  330.  
  331.  
  332.  
  333. _object = function ():* {
  334.  
  335. var k:* = {} ;
  336.  
  337. var o:* = {} ;
  338.  
  339. if (ch == '{') {
  340.  
  341.  
  342.  
  343. _next();
  344.  
  345.  
  346.  
  347. _white();
  348.  
  349.  
  350.  
  351. if (ch == '}')
  352.  
  353. {
  354.  
  355. _next() ;
  356.  
  357. return o ;
  358.  
  359. }
  360.  
  361.  
  362.  
  363. while (ch)
  364.  
  365. {
  366.  
  367. k = _string();
  368.  
  369. _white();
  370.  
  371. if (ch != ':')
  372.  
  373. {
  374.  
  375. break;
  376.  
  377. }
  378.  
  379. _next();
  380.  
  381. o[k] = _value();
  382.  
  383. _white();
  384.  
  385. if (ch == '}') {
  386.  
  387. _next();
  388.  
  389. return o;
  390.  
  391. } else if (ch != ',') {
  392.  
  393. break;
  394.  
  395. }
  396.  
  397. _next();
  398.  
  399. _white();
  400.  
  401. }
  402.  
  403. }
  404.  
  405. _error("Bad Object") ;
  406.  
  407. };
  408.  
  409.  
  410.  
  411. _number = function ():* {
  412.  
  413.  
  414.  
  415. var n:* = '' ;
  416.  
  417. var v:* ;
  418.  
  419. var hex:String = '' ;
  420.  
  421. var sign:String = '' ;
  422.  
  423.  
  424.  
  425. if (ch == '-') {
  426.  
  427. n = '-';
  428.  
  429. sign = n ;
  430.  
  431. _next();
  432.  
  433. }
  434.  
  435.  
  436.  
  437. if( ch == "0" ) {
  438.  
  439. _next() ;
  440.  
  441. if( ( ch == "x") || ( ch == "X") ) {
  442.  
  443. _next();
  444.  
  445. while( _isHexDigit( ch ) ) {
  446.  
  447. hex += ch ;
  448.  
  449. _next();
  450.  
  451. }
  452.  
  453. if( hex == "" ) {
  454.  
  455. _error("mal formed Hexadecimal") ;
  456.  
  457. } else {
  458.  
  459. return Number( sign + "0x" + hex ) ;
  460.  
  461. }
  462.  
  463. } else {
  464.  
  465. n += "0" ;
  466.  
  467. }
  468.  
  469. }
  470.  
  471.  
  472.  
  473. while ( _isDigit(ch) ) {
  474.  
  475. n += ch;
  476.  
  477. _next();
  478.  
  479. }
  480.  
  481. if (ch == '.') {
  482.  
  483. n += '.';
  484.  
  485. while (_next() && ch >= '0' && ch <= '9') {
  486.  
  487. n += ch;
  488.  
  489. }
  490.  
  491. }
  492.  
  493. v = 1 * n ;
  494.  
  495. if (!isFinite(v)) {
  496.  
  497. _error("Bad Number");
  498.  
  499. } else {
  500.  
  501. return v;
  502.  
  503. }
  504.  
  505.  
  506.  
  507. return NaN ;
  508.  
  509.  
  510.  
  511. };
  512.  
  513.  
  514.  
  515. _word = function ():* {
  516.  
  517. switch (ch) {
  518.  
  519. case 't':
  520.  
  521. if (_next() == 'r' && _next() == 'u' && _next() == 'e') {
  522.  
  523. _next();
  524.  
  525. return true;
  526.  
  527. }
  528.  
  529. break;
  530.  
  531. case 'f':
  532.  
  533. if (_next() == 'a' && _next() == 'l' && _next() == 's' && _next() == 'e') {
  534.  
  535. _next();
  536.  
  537. return false;
  538.  
  539. }
  540.  
  541. break;
  542.  
  543. case 'n':
  544.  
  545. if (_next() == 'u' && _next() == 'l' && _next() == 'l') {
  546.  
  547. _next();
  548.  
  549. return null;
  550.  
  551. }
  552.  
  553. break;
  554.  
  555. }
  556.  
  557. _error("Syntax Error");
  558.  
  559. return null ;
  560.  
  561. };
  562.  
  563.  
  564.  
  565. _value = function ():* {
  566.  
  567. _white();
  568.  
  569. switch (ch) {
  570.  
  571. case '{':
  572.  
  573. return _object();
  574.  
  575. case '[':
  576.  
  577. return _array();
  578.  
  579. case '"':
  580.  
  581. return _string();
  582.  
  583. case '-':
  584.  
  585. return _number();
  586.  
  587. default:
  588.  
  589. return ch >= '0' && ch <= '9' ? _number() : _word();
  590.  
  591. }
  592.  
  593. };
  594.  
  595.  
  596.  
  597. return _value() ;
  598.  
  599.  
  600.  
  601. }
  602.  
  603.  
  604.  
  605. static public function serialize(o:*):String {
  606.  
  607.  
  608.  
  609. var c:String ; // char
  610.  
  611. var i:Number ;
  612.  
  613. var l:Number ;
  614.  
  615. var s:String = '' ;
  616.  
  617. var v:* ;
  618.  
  619.  
  620.  
  621. switch (typeof o)
  622.  
  623. {
  624.  
  625.  
  626.  
  627. case 'object' :
  628.  
  629.  
  630.  
  631. if (o)
  632.  
  633. {
  634.  
  635. if (o is Array)
  636.  
  637. {
  638.  
  639.  
  640.  
  641. l = o.length ;
  642.  
  643.  
  644.  
  645. for (i = 0 ; i < l ; ++i)
  646.  
  647. {
  648.  
  649. v = serialize(o[i]);
  650.  
  651. if (s) s += ',' ;
  652.  
  653. s += v ;
  654.  
  655. }
  656.  
  657. return '[' + s + ']';
  658.  
  659.  
  660.  
  661. }
  662.  
  663. else if (typeof(o.toString) != 'undefined')
  664.  
  665. {
  666.  
  667.  
  668.  
  669. for (var prop:String in o)
  670.  
  671. {
  672.  
  673. v = o[prop];
  674.  
  675. if ( (typeof(v) != 'undefined') && (typeof(v) != 'function') )
  676.  
  677. {
  678.  
  679. v = serialize(v);
  680.  
  681. if (s) s += ',';
  682.  
  683. s += serialize(prop) + ':' + v ;
  684.  
  685. }
  686.  
  687. }
  688.  
  689. return "{" + s + "}";
  690.  
  691. }
  692.  
  693. }
  694.  
  695. return 'null';
  696.  
  697.  
  698.  
  699. case 'number':
  700.  
  701.  
  702.  
  703. return isFinite(o) ? String(o) : 'null' ;
  704.  
  705.  
  706.  
  707. case 'string' :
  708.  
  709.  
  710.  
  711. l = o.length ;
  712.  
  713. s = '"';
  714.  
  715. for (i = 0 ; i < l ; i += 1) {
  716.  
  717. c = o.charAt(i);
  718.  
  719. if (c >= ' ') {
  720.  
  721. if (c == '\\' || c == '"')
  722.  
  723. {
  724.  
  725. s += '\\';
  726.  
  727. }
  728.  
  729. s += c;
  730.  
  731. }
  732.  
  733. else
  734.  
  735. {
  736.  
  737. switch (c)
  738.  
  739. {
  740.  
  741.  
  742.  
  743. case '\b':
  744.  
  745. s += '\\b';
  746.  
  747. break;
  748.  
  749. case '\f':
  750.  
  751. s += '\\f';
  752.  
  753. break;
  754.  
  755. case '\n':
  756.  
  757. s += '\\n';
  758.  
  759. break;
  760.  
  761. case '\r':
  762.  
  763. s += '\\r';
  764.  
  765. break;
  766.  
  767. case '\t':
  768.  
  769. s += '\\t';
  770.  
  771. break;
  772.  
  773. default:
  774.  
  775. var code:Number = c.charCodeAt() ;
  776.  
  777. s += '\\u00' + (Math.floor(code / 16).toString(16)) + ((code % 16).toString(16)) ;
  778.  
  779. }
  780.  
  781. }
  782.  
  783. }
  784.  
  785. return s + '"';
  786.  
  787.  
  788.  
  789. case 'boolean':
  790.  
  791. return String(o);
  792.  
  793.  
  794.  
  795. default:
  796.  
  797. return 'null';
  798.  
  799.  
  800.  
  801. }
  802.  
  803. }
  804.  
  805. }
  806.  
  807. }

Report this snippet


Comments

RSS Icon Subscribe to comments

You need to login to post a comment.