2010-04-09

JSON Formatter

可搭配 as3corelib 裡的 JSON 類別使用, 格式化 JSON 字串, 以方便給人閱讀。在這裡並不會檢查JSON 的格式是否正確。

package lin.shinder.utils 
{
 /**
  * ...
  * @author shinder.lin
  */
 public class JsonFormatter
 {
  private var spaces:int;
  private var spaceUnit:String = " ";
  private var resultStr:String = "";
  private var prevCh:String;
  
  public function JsonFormatter(str:String = null) {
   if (str) {
    findBracket( str );
   }
  }

  public function get result():String {
   if ( resultStr.charAt(0) == "\n") {
    resultStr = resultStr.slice(1);
   }
   return resultStr;
  }
  
  private function findBracket(str:String):void {
   var ch:String;
   var leftStr:String;
   var midStr:String;
   var rightStr:String;

   for (var i:int = 0; i < str.length; i++) {
    ch = str.charAt(i);

    if ( ch == '[' || ch == '{' || ch == ',' ) {
     leftStr = str.slice(0, i + 1);
     rightStr = str.slice(i + 1);
     break;
    } else if ( ch == '}' || ch == ']' ) {
     leftStr = str.slice(0, i);
     midStr = str.slice(i, i+1);
     rightStr = str.slice(i+1);
     break;
    } 
   }
   if (leftStr == null) {
    return;
   }
   if (ch == ',' && (prevCh=='}' || prevCh==']')) {
    resultStr += leftStr;
   } else {
    resultStr += getSpaces() + leftStr;
   }
   switch(ch) {
    case '[':
     spaces ++;
     break;
    case '{':
     spaces ++;
     break;
    case '}':
     spaces --;
     break;
    case ']':
     spaces --;
     break;
   }
   
   if (midStr != null) {
    resultStr += getSpaces() + midStr;
   }
   prevCh = ch;
   
   if(rightStr.length>1) {
    findBracket( rightStr );
   } else {
    resultStr += "\n" + rightStr;
   }
  }
  
  private function getSpaces():String {
   var str:String = "\n";
   for (var i:int = 0; i < spaces; i++){
    str += spaceUnit;
   }
   return str;
  }
 }

}

2 則留言:

匿名 提到...

我想請問一下 我是使用flash CS4
請問他可以支援JSON嗎?有JSON類別嗎?
應為我看其他人網路解碼時都用
com.adobe.serialization.json.JSON
cs4有嗎?
可以的話大大解答一下 謝謝

Shinder 提到...

https://github.com/mikechambers/as3corelib

FB 留言