as2写的json解析,带容错,如果要做格式检查,得自己修改了,直接贴代码

//--------------------------------------------------json解析----------------------------------------------------------
class Json extends Object{
    public static var pos:Number=0;
    
    private static function isDigit( ch:String ):Boolean
    {
            return ( ch >= '0' && ch <= '9' )||( ch == "+" )||( ch == "-" )||( ch == "." );
    }
    
    private static function isHexDigit( ch:String ):Boolean
    {
            return ( isDigit( ch ) || ( ch >= 'A' && ch <= 'F' ) || ( ch >= 'a' && ch <= 'f' ) );
    }
        
    private static function toTrue(str:String, from:Number,to:Number)
    {
        pos=from+3;
        return true;
    }
    
    private static function toFalse(str:String, from:Number, to:Number)
    {
        pos=from+4;
        return false;
    }
    
    private static function toNull(str:String, from:Number, to:Number)
    {
        pos=from+3;
        return null;
    }
    
    private static function toNAN(str:String, from:Number, to:Number)
    {
        pos=from+2;
        return Number.NaN;
    }
    private static function toNumber(str:String, from:Number, to:Number)
    {
        var i:Number = from+1;
        while(i<=to)
        {
            var c = str.charAt(i);
            if(!isDigit(c))
                break
            i++;
        }
        var num:Number = Number(str.substring(from, i))
        if(!isFinite(num))
            throw{msg:"json格式错误,不正确的数字, 错误位置:"+from};
        pos=i-1;
        return num;
    }
    
    public static function unescapeString( str:String ):String
    {
        var pos:Number = 0;
        var result="";
        while(pos<str.length)
        {
            var c:String=str.charAt(pos);
            if(c=="\\"){
                if((pos+5<str.length) && str.charAt(pos+1)=="u")
                {
                    var hexValue:String = "";
                    for ( var i:Number = pos+2; i < pos + 6; i++ )
                    {
                        var c:String = str.charAt( i );
                        if ( !isHexDigit( c ) )
                        {
                            throw{msg:"json格式错误,字符串unicode编码转换错误,错误位置:"+i};
                        }
                        hexValue += c;
                    }
                    result += String.fromCharCode( parseInt( hexValue, 16 ) );
                    pos=pos+5;
                }else{
                    result=result+c;
                }
            }else{
                result=result+c;
            }
            pos=pos+1;
        }
        return result;
    }
    
    private static function toStr(str:String, from:Number,    to:Number)
    {
        var ignor:Boolean = false
        for(var i:Number = from+1; i<=to; i++)
        {
            var c:String=str.charAt(i);
            if(!ignor)
            {
                if(c=="\"")
                {
                    pos=i;
                    return unescapeString(str.substring(from+1, i));
                    //return str.substring(from+1, i);
                }else if(c=="\\")
                    ignor=true;
            }else{
                ignor=false;
            }
        }
        
        throw{msg:'json格式错误,字符串没有找到结尾, 错误位置:'+from};
    }
    
    private static function toArray(str:String, from:Number, to:Number)
    {
        var arr:Array = [];
        pos=from+1;
        while(pos<=to)
        {
            var c:String = str.charAt(pos);
            switch(c)
            {
                case "\"":
                    arr.push(toStr(str, pos, to));
                    break;
                case  "[":
                    arr.push(toArray(str, pos, to));
                    break;
                case "{":
                    arr.push(toObject(str, pos, to));
                    break;
                case "]":
                    return arr;
                case "f":
                    arr.push(toFalse(str, pos, to));
                    break;
                case "F":
                    arr.push(toFalse(str, pos, to));
                    break;
                case "t":
                    arr.push(toTrue(str, pos, to));
                    break;
                case "T":
                    arr.push(toTrue(str, pos, to));
                    break;
                case "n":
                    arr.push(toNull(str, pos, to));
                    break;
                case "N":
                    arr.push(toNAN(str, pos, to));
                    break;
                default:
                    if(isDigit(c))
                        arr.push(toNumber(str, pos, to));
            }
            pos=pos+1;
        }
        throw{msg: 'json格式错误,表没有找到结尾, 错误位置:'+from};
    }
    
    private static function toObject(str:String, from:Number,    to:Number)
    {
        var obj:Object = {};
        var key;
        pos=from+1;
        while(pos<=to)
        {
            var c:String = str.charAt(pos);
            switch(c)
            {
                case "\"":
                    if(!key)
                    {
                        key=toStr(str, pos, to);
                    }else{
                        obj[key] = toStr(str,pos,to);
                        key = null;
                    }
                    break;
                case  "[":
                    if(!key){
                        key=toArray(str, pos, to);
                    }else{
                        obj[key]=toArray(str, pos, to);
                        key=null;
                    }
                    break;
                case "{":
                    if(!key){
                        key=toObject(str, pos, to);
                    }else{
                        obj[key]=toObject(str, pos, to);
                        key=null;
                    }
                    break;
                case "}":
                    return obj;
                case "]":
                    return obj;
                case "f":
                    if(!key)
                        throw{msg:"json格式错误,boolean不能做key, 错误位置:"+from};
                    obj[key]=toFalse(str, pos, to);
                    break;
                case "F":
                    if(!key)
                        throw{msg:"json格式错误,boolean不能做key, 错误位置:"+from};
                    obj[key]=toFalse(str, pos, to);
                    break;
                case "t":
                    if(!key)
                        throw{msg:"json格式错误,boolean不能做key, 错误位置:"+from};
                    obj[key]=toTrue(str, pos, to);
                case "T":
                    if(!key)
                        throw{msg:"json格式错误,boolean不能做key, 错误位置:"+from};
                    obj[key]=toTrue(str, pos, to);
                    break;
                case "n":
                    if(!key)
                        throw{msg:"json格式错误,null不能做key, 错误位置:"+from};
                    obj[key]=toNull(str, pos, to);
                    break;
                case "N":
                    if(!key)
                        throw{msg:"json格式错误,nan不能做key, 错误位置:"+from};
                    obj[key]=toNAN(str, pos, to);
                    break;
                default:
                    if(isDigit(c)){
                        if(!key){
                            key=toNumber(str, pos, to);
                        }else{
                            obj[key]=toNumber(str, pos, to);
                            key=null;
                        }
                    }
            }
            pos = pos + 1
        }
        throw{msg:'json格式错误,表没有找到结尾, 错误位置:}'+from};
    }
    
    public static function decode(str:String)
    {
        pos=0;
        if(str=="")
            return null;
        var c=str.charAt(pos);
        switch(c)
        {
            case "\"":
                return toStr(str, pos, str.length-1);
            case "[":
                return toArray(str, pos, str.length-1);
            case "{":
                return toObject(str, pos, str.length-1);
            case "f":
                return false;
            case "F":
                return false;
            case "t":
                return true;
            case "n":
                return null;
            case "N":
                return Number.NaN;
            case "T":
                return true;
            default:
                if(isDigit(c))
                    return toNumber(str, pos, str.length-1);
        }
    }
}

as2解析json的更多相关文章

  1. Xamarin.Android下获取与解析JSON

    一.新建项目 1.新建一个Android项目,并命名为为NetJsonList 2.右击引用,选择添加引用,引用System.Json.dll 二.同步请求 既然是跨平台,我们自然不能按照java下的 ...

  2. 使用Newtonsoft.Json.dll(JSON.NET)动态解析JSON、.net 的json的序列化与反序列化(一)

    在开发中,我非常喜欢动态语言和匿名对象带来的方便,JSON.NET具有动态序列化和反序列化任意JSON内容的能力,不必将它映射到具体的强类型对象,它可以处理不确定的类型(集合.字典.动态对象和匿名对象 ...

  3. 阶段一:通过网络请求,获得并解析JSON数据(天气应用)

    “阶段一”是指我第一次系统地学习Android开发.这主要是对我的学习过程作个记录. 在上一篇阶段一:解析JSON中提到,最近在写一个很简单的天气预报应用.即使功能很简单,但我还是想把它做成一个相对完 ...

  4. 阶段一:解析JSON

    “阶段一”是指我第一次系统地学习Android开发.这主要是对我的学习过程作个记录. 最近学到解析JSON格式的网络数据,而作业也要求自己找一个天气预报的API地址,然后解析其中JSON格式的数据.可 ...

  5. C语言创建及解析Json的使用法则

    参考原文:http://blog.csdn.net/xukai871105/article/details/33013455 JSON(JavaScriptObject Notation)是一种轻量级 ...

  6. 不一样的dynamic解析json 万能方法

    写过javascript的人都知道js解析json 1:(JSON) 字符串转换为对象. var str = '{"name":"lsw","hobb ...

  7. C# 解析JSON的几种办法

    欲成为海洋大师,必知晓海中每一滴水的真名. 刚开始只是想找一个转换JSON数组的方法,结果在MSDN翻到一大把. 搜索过程中免不了碰到一大堆名词:WCF => DataContract => ...

  8. eval解析JSON中的注意点

       在JS中将JSON的字符串解析成JSON数据格式,一般有两种方式: 1.一种为使用eval()函数. 2. 使用Function对象来进行返回解析. 使用eval函数来解析,并且使用jquery ...

  9. C#解析json文件的方法

    C# 解析 json JSON(全称为JavaScript Object Notation) 是一种轻量级的数据交换格式.它是基于JavaScript语法标准的一个子集. JSON采用完全独立于语言的 ...

随机推荐

  1. 2017.5.1 java动态代理总结

    参考来自:http://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html 1.代理模式 代理类和委托类有相同接口. 代理类负责为委托类:预处理消 ...

  2. Import CSV into DB using SSIS

    Step 1: create a table CREATE TABLE [EmployeeImported]( ,) NOT NULL, [ContactID] [int] NOT NULL, [Ma ...

  3. Linux网络编程中tcp_server和tcp_client函数的封装

    本文的主要目的是将server套接字和client套接字的获取,做一个简易的封装,使用C语言完成.   tcp_server   服务器端fd的获取主要分为以下几步: 1.创建socket,这一步仅仅 ...

  4. C. Glass Carving (CF Round #296 (Div. 2) STL--set的运用 &amp;&amp; 并查集方法)

    C. Glass Carving time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  5. 【Java】Java_20 Scanner获取键盘输入

    使用Scanner类可以很方便的获取用户的键盘输入,Scanner是一个基于正则表达式子的文本扫描器,他可以从文件.输入流.字符串中解析出基本类型值和字符串值. 例子示意: package com.o ...

  6. IDEA报compilation failed:internal java compiler error解决方法

    java complier 设置的问题  ,项目中有的配jdk1.6,有的配jdk1.7,版本不一样,导致这样的错误,提示这样的报错时,从file-Settings进入

  7. 浅析Java语言中两种异常的差别

    Java提供了两类主要的异常:runtime exception和checked exception.所有的checked exception是从java.lang.Exception类衍生出来的,而 ...

  8. C#开发--FTP操作方法管理

    1.整理简化了下C#的ftp操作,方便使用    1.支持创建多级目录    2.批量删除    3.整个目录上传    4.整个目录删除    5.整个目录下载 2.调用方法展示, var ftp ...

  9. Trie|如何用字典树实现搜索引擎的关键词提示功能

    Trie字典树 Trie字典树又称前缀树,顾名思义,是查询前缀匹配的一种树形数据结构 可以分为插入(创建) 和 查询两部分.参考地址极客时间 下图为插入字符串的过程: 创建完成后,每个字符串最后一个字 ...

  10. iOS CAGradientLayer白色渐变至上向下

    项目需求当显示富文本内容高度太高的的时候不全部显示出来,而是显示查看更多按钮,当点击查看更多时把全部内容展开.同时未展开部分要加一个渐变模糊的效果. 上效果图: 这里要用到CAGradientLaye ...