as2解析json
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的更多相关文章
- Xamarin.Android下获取与解析JSON
一.新建项目 1.新建一个Android项目,并命名为为NetJsonList 2.右击引用,选择添加引用,引用System.Json.dll 二.同步请求 既然是跨平台,我们自然不能按照java下的 ...
- 使用Newtonsoft.Json.dll(JSON.NET)动态解析JSON、.net 的json的序列化与反序列化(一)
在开发中,我非常喜欢动态语言和匿名对象带来的方便,JSON.NET具有动态序列化和反序列化任意JSON内容的能力,不必将它映射到具体的强类型对象,它可以处理不确定的类型(集合.字典.动态对象和匿名对象 ...
- 阶段一:通过网络请求,获得并解析JSON数据(天气应用)
“阶段一”是指我第一次系统地学习Android开发.这主要是对我的学习过程作个记录. 在上一篇阶段一:解析JSON中提到,最近在写一个很简单的天气预报应用.即使功能很简单,但我还是想把它做成一个相对完 ...
- 阶段一:解析JSON
“阶段一”是指我第一次系统地学习Android开发.这主要是对我的学习过程作个记录. 最近学到解析JSON格式的网络数据,而作业也要求自己找一个天气预报的API地址,然后解析其中JSON格式的数据.可 ...
- C语言创建及解析Json的使用法则
参考原文:http://blog.csdn.net/xukai871105/article/details/33013455 JSON(JavaScriptObject Notation)是一种轻量级 ...
- 不一样的dynamic解析json 万能方法
写过javascript的人都知道js解析json 1:(JSON) 字符串转换为对象. var str = '{"name":"lsw","hobb ...
- C# 解析JSON的几种办法
欲成为海洋大师,必知晓海中每一滴水的真名. 刚开始只是想找一个转换JSON数组的方法,结果在MSDN翻到一大把. 搜索过程中免不了碰到一大堆名词:WCF => DataContract => ...
- eval解析JSON中的注意点
在JS中将JSON的字符串解析成JSON数据格式,一般有两种方式: 1.一种为使用eval()函数. 2. 使用Function对象来进行返回解析. 使用eval函数来解析,并且使用jquery ...
- C#解析json文件的方法
C# 解析 json JSON(全称为JavaScript Object Notation) 是一种轻量级的数据交换格式.它是基于JavaScript语法标准的一个子集. JSON采用完全独立于语言的 ...
随机推荐
- 资深程序员教你如何实现API自动化测试平台!附项目源码!
原文链接: 1.平时测试接口,总是现写代码,对测试用例的管理,以及测试报告的管理持久化做的不够, 2.工作中移动端开发和后端开发总是不能并行进行,需要一个mock的依赖来让他们并行开发. 3.同时让自 ...
- running android lint has encountered a
近期写学习android编程的的时候,每次保存.java文件的时候,总会跳出例如以下错误 这个错误不是属于程序错误,把它关掉对于编程没有不论什么影响,但每次见到这个就是不爽,希望大神可以解决一下,谢谢 ...
- JMS 在 SpringBoot 中的使用
当前环境 Mac OS 10.11.x docker 1.12.1 JDK 1.8 SpringBoot 1.5 前言 基于之前一篇“一个故事告诉你什么是消息队列”,了解了消息队列的使用场景以及相关的 ...
- Laravel之Elixir
一.Elixir安装和设置 1.安装node.js 2.安装Gulp 作为全局NPM 包 npm install --global gulp 3.最后,在新安装的Laravel 根目录下,你会发现有一 ...
- redhat 用yum安装的apache、mysql一般默认安装在哪个目录下?
使用yum安装成功后,使用rpm -qa | grep httpd和rpm -qa | grep mysql查看是否安装成功然后使用rpm -ql httpd和rpm -ql mysql查看安装文件都 ...
- 数据文件offline 时oracle 干了那些事?
SQL> oradebug setmypid Statement processed. SQL> oradebug unlimit Statement processed. SQL> ...
- Linux终端:speedtest_cli检测你的实时带宽速度
你在家(或者办公室)的上传和下载速度如何?你能保证,你支付费用给ISP的同时得到了等价的回报? 要想测试我们因特网连接的速度,当下存在着一些因特网服务,比如说SpeedTest,这是一种可以通过Web ...
- RabbitMQ功能测试+性能测试简单方法
一.如何测试RabbitMQ的功能 1.联系开发找到队列的名称:登录MQ后台管理地址;点击Queues页,输入队列名搜索出目标队列(支持模糊查询) 2.准备测试数据 (1)已知json格式时,根据不同 ...
- myeclipse8.6 git 安装学习
只有公司有svn,回到宿舍无法访问,因此没法做迭代开发,因此最近学习了git,这样在公司了提交的代码,回到宿舍也可以继续开发,用了一天的时间才弄明白git的原理,智商有问题啊,下面说下具体步骤,个人已 ...
- 关于javaSocket中 Software caused connection abort: recv failed问题
在学习Socket中今天突然遇到了以下这种问题 原来是网路连接出了问题,由于我測试的是远程连接所以是在学校的局域网下,结果非常不稳定,開始还以为怎么了一会连上了一会又出现故障然后把IP地址改为本机的1 ...