JsonDecoder={
pos:0,
isDigit:function(ch){
return ( ch >= '0' && ch <= '9' )||( ch == "+" )||( ch == "-" )||( ch == "." );
},
isHexDigit:function( ch )
{
return ( JsonDecoder.isDigit( ch ) || ( ch >= 'A' && ch <= 'F' ) || ( ch >= 'a' && ch <= 'f' ) );
},
toTrue:function(str, from,to)
{
JsonDecoder.pos=from+3;
return true;
},
toFalse:function(str, from, to)
{
JsonDecoder.pos=from+4;
return false;
},
toNull:function(str, from, to)
{
JsonDecoder.pos=from+3;
return null;
},
toNAN:function (str, from, to)
{
JsonDecoder.pos=from+2;
return Number.NaN;
},
toNumber:function (str, from, to)
{
var i= from+1;
while(i<=to)
{
fl.trace(str);
var c = str.charAt(i);
if(!JsonDecoder.isDigit(c))
break
i++;
}
var num = Number(str.substring(from, i))
if(!isFinite(num))
throw{msg:"json格式错误,不正确的数字, 错误位置:"+from};
JsonDecoder.pos=i-1;
return num;
},
unescapeString:function( str )
{
var pos = 0;
var result="";
while(pos<str.length)
{
var c=str.charAt(pos);
if(c=="\\"){
if((pos+5<str.length) && str.charAt(pos+1)=="u")
{
var hexValue = "";
for ( var i= pos+2; i < pos + 6; i++ )
{
var c = str.charAt( i );
if ( !JsonDecoder.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;
},
/*unescapeString:function( str )
{
return unescape(str);
},*/
toStr:function(str, from, to)
{
var ignor = false
for(var i = from+1; i<=to; i++)
{
var c=str.charAt(i);
if(!ignor)
{
if(c=="\"")
{
JsonDecoder.pos=i;
return JsonDecoder.unescapeString(str.substring(from+1, i));
//return str.substring(from+1, i);
}else if(c=="\\")
ignor=true;
}else{
ignor=false;
}
}

throw{msg:'json格式错误,字符串没有找到结尾, 错误位置:'+from};
},
toArray:function(str, from, to)
{
var arr = [];
JsonDecoder.pos=from+1;
while(JsonDecoder.pos<=to)
{
var c = str.charAt(JsonDecoder.pos);
switch(c)
{
case "\"":
arr.push(JsonDecoder.toStr(str, JsonDecoder.pos, to));
break;
case "[":
arr.push(JsonDecoder.toArray(str, JsonDecoder.pos, to));
break;
case "{":
arr.push(JsonDecoder.toObject(str, JsonDecoder.pos, to));
break;
case "]":
return arr;
case "f":
arr.push(JsonDecoder.toFalse(str, JsonDecoder.pos, to));
break;
case "F":
arr.push(JsonDecoder.toFalse(str, JsonDecoder.pos, to));
break;
case "t":
arr.push(JsonDecoder.toTrue(str, JsonDecoder.pos, to));
break;
case "T":
arr.push(JsonDecoder.toTrue(str, JsonDecoder.pos, to));
break;
case "n":
arr.push(JsonDecoder.toNull(str, JsonDecoder.pos, to));
break;
case "N":
arr.push(JsonDecoder.toNAN(str, JsonDecoder.pos, to));
break;
default:
if(JsonDecoder.isDigit(c))
arr.push(JsonDecoder.toNumber(str, JsonDecoder.pos, to));
}
JsonDecoder.pos=JsonDecoder.pos+1;
}
throw{msg: 'json格式错误,表没有找到结尾, 错误位置:'+from};
},
toObject:function(str, from, to)
{
var obj = {};
var key;
JsonDecoder.pos=from+1;
while(JsonDecoder.pos<=to)
{
var c = str.charAt(JsonDecoder.pos);
switch(c)
{
case "\"":
if(!key)
{
key=JsonDecoder.toStr(str, JsonDecoder.pos, to);
}else{
obj[key] = JsonDecoder.toStr(str,JsonDecoder.pos,to);
key = null;
}
break;
case "[":
if(!key){
key=JsonDecoder.toArray(str, JsonDecoder.pos, to);
}else{
obj[key]=JsonDecoder.toArray(str, JsonDecoder.pos, to);
key=null;
}
break;
case "{":
if(!key){
key=JsonDecoder.toObject(str, JsonDecoder.pos, to);
}else{
obj[key]=JsonDecoder.toObject(str, JsonDecoder.pos, to);
key=null;
}
break;
case "}":
return obj;
case "]":
return obj;
case "f":
if(!key)
throw{msg:"json格式错误,boolean不能做key, 错误位置:"+from};
obj[key]=JsonDecoder.toFalse(str, JsonDecoder.pos, to);
break;
case "F":
if(!key)
throw{msg:"json格式错误,boolean不能做key, 错误位置:"+from};
obj[key]=JsonDecoder.toFalse(str, JsonDecoder.pos, to);
break;
case "t":
if(!key)
throw{msg:"json格式错误,boolean不能做key, 错误位置:"+from};
obj[key]=JsonDecoder.toTrue(str, JsonDecoder.pos, to);
case "T":
if(!key)
throw{msg:"json格式错误,boolean不能做key, 错误位置:"+from};
obj[key]=JsonDecoder.toTrue(str, JsonDecoder.pos, to);
break;
case "n":
if(!key)
throw{msg:"json格式错误,null不能做key, 错误位置:"+from};
obj[key]=JsonDecoder.toNull(str, JsonDecoder.pos, to);
break;
case "N":
if(!key)
throw{msg:"json格式错误,nan不能做key, 错误位置:"+from};
obj[key]=JsonDecoder.toNAN(str, JsonDecoder.pos, to);
break;
default:
if(JsonDecoder.isDigit(c)){
if(!key){
key=JsonDecoder.toNumber(str, JsonDecoder.pos, to);
}else{
obj[key]=JsonDecoder.toNumber(str, JsonDecoder.pos, to);
key=null;
}
}
}
JsonDecoder.pos = JsonDecoder.pos + 1
}
throw{msg:'json格式错误,表没有找到结尾, 错误位置:}'+from};
},
decode:function(str)
{
JsonDecoder.pos=0;
if(str=="")
return null;
var c=str.charAt(JsonDecoder.pos);
switch(c)
{
case "\"":
return JsonDecoder.toStr(str, JsonDecoder.pos, str.length-1);
case "[":
return JsonDecoder.toArray(str, JsonDecoder.pos, str.length-1);
case "{":
return JsonDecoder.toObject(str, JsonDecoder.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(JsonDecoder.isDigit(c))
return JsonDecoder.toNumber(str, JsonDecoder.pos, str.length-1);
}
},
}

JsonEncoder={
fromNumber:function(n){
return String(n);
},
fromBoolean:function(b)
{
return b?"true":"false";
},
escapeString:function(str){
return escape(str);
},
fromStr:function(s){
return "\""+JsonEncoder.escapeString(s)+"\"";
},
fromUndefined:function(){
return "null";
},
fromObject:function(obj){
var s="{";
for(var k in obj)
{
s=s+JsonEncoder.encode(k)+":"+JsonEncoder.encode(obj[k]);
s=s+",";
}
return s.slice(0, -1)+"}";
},
fromArray:function(arr){
var s="[";
for(var ii=0; ii<arr.length; ii++)
{
s=s+JsonEncoder.encode(arr[ii]);
if(ii!=arr.length-1){
s=s+",";
}
}
return s+"]";
},
fromFunction:function(){
error("can not encode function type");
},
encode:function(obj)
{
if(obj instanceof Array)
return JsonEncoder.fromArray(obj);
switch(typeof(obj))
{
case "number":
return JsonEncoder.fromNumber(obj);
case "boolean":
return JsonEncoder.fromBoolean(obj);
case "string":
return JsonEncoder.fromStr(obj);
case "function":
return JsonEncoder.fromFunction(obj);
case "object":
return JsonEncoder.fromObject(obj);
case "undefined":
return JsonEncoder.fromUndefined(obj);
defualt:
error("error kind");
}
},
}

Json={
encode:JsonEncoder.encode,
decode:JsonDecoder.decode,
}

Object.prototype.toString=function()
{
var kind=typeof(this);
switch(typeof(obj))
{
case "number":
return String(this)
case "boolean":
return JsonEncoder.fromBoolean(obj);
case "string":
return JsonEncoder.fromStr(obj);
case "function":
return JsonEncoder.fromFunction(obj);
case "object":
return JsonEncoder.fromObject(obj);
case "undefined":
return JsonEncoder.fromUndefined(obj);
defualt:
error("error kind");
}
}

Array.prototype.toString=function()
{
var s="[";
var bempty=true;
for(var ii=0; ii<this.length; ii++)
{
bempty=false;
s=s+String(this[ii])+",";
}
if(!bempty){
s=s.slice(0, -1);
}
return s+"]";
}

Object.prototype.toString=function()
{
var s="{";
var bempty=true;
for(var k in this)
{
bempty=false;
s=s+String(k)+":"+String(this[k])+",";
}
if(!bempty){
s=s.slice(0, -1);
}
return s+"}";
}

Js版json解析的更多相关文章

  1. COCOS2D - JS 之JSON 解析

    list 类型的json数据  var source = ["10004","1234","4","3","1 ...

  2. js对json解析获取对应属性的值,JSON.stringify()和JSON.parse()

    JSON.stringify() 该方法,将一个JSON对象转化为字符串string JSON.parse() 该方法,将一个字符串转化为JSON对象object 对于JSON对象,获取其对应键值 可 ...

  3. 一个用C++写的Json解析与处理库

    什么是Json?这个库能做什么? JSON (JavaScript Object Notation) is a lightweight data-interchange format. It is e ...

  4. 《项目经验》--后台一般处理程序向前台JS文件传递JSON,JS解析JSON,将数据显示在界面--显示在DropDownList 或 显示在动态创建的table中

    http://blog.csdn.net/mazhaojuan/article/details/8599167 先看一下我要实现的功能界面: 这篇文章主要介绍:后台一般处理程序把从数据库查找的数据,转 ...

  5. JS中将JSON的字符串解析成JSON数据格式《转》

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

  6. js中eval详解,用Js的eval解析JSON中的注意点

    先来说eval的用法,内容比较简单,熟悉的可以跳过eval函数接收一个参数s,如果s不是字符串,则直接返回s.否则执行s语句.如果s语句执行结果是一个值,则返回此值,否则返回undefined. 需要 ...

  7. 用Js的eval解析JSON中的注意点

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

  8. PureMVC(JS版)源码解析:总结

    PureMVC源码中设计到的11个类已经全部解析完了,回首想想,花了一周的时间做的这点事情还是挺值得的,自己的文字组织表达能力和对pureMVC的理解也在写博客的过程中得到了些提升.我也是第一次写系列 ...

  9. PureMVC(JS版)源码解析

    PureMVC(JS版)源码解析:总结   PureMVC源码中设计到的11个类已经全部解析完了,回首想想,花了一周的时间做的这点事情还是挺值得的,自己的文字组织表达能力和对pureMVC的理解也在写 ...

随机推荐

  1. Android 软键盘的监听(监听高度,是否显示)

    Android官方本身没有提供一共好的方法来对软键盘进行监听,但我们实际应用时.非常多地方都须要针对软键盘来对UI进行一些优化. 下面是整理出来的一个不错的方法.大家能够使用. public clas ...

  2. AI学习笔记

    人人都是产品经理,继续设计课程啦啦啦啦 ADOBE: ps, ai, fl, dw, fw, ae, pr, id   COREL: painter coreldraw   autodesk: 三维: ...

  3. react-navigation-easy-helper

    本组件旨在不更改源码情况下,简单配置即可实现一些复杂的功能.如在任意位置进行跳转.根据路由名字返回指定页面.简化参数的获取.快速点击的拦截.统一页面跳转的拦截等. 安装: npm install re ...

  4. lodash 数组裁剪 drop

    _.drop(array, [n=1]) 裁剪数组中的前 N 个数组,返回剩余的部分. <!DOCTYPE html> <html lang="zh"> & ...

  5. 随想录(做自己代码的測试project师)

    [ 声明:版权全部.欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 非常多project师都有一个不好的习惯,由于大多数itproject师都喜欢写代码.可是不喜欢 ...

  6. Java jar转exe

    http://www.blogjava.net/baoyaer/articles/97405.html Java转exe篇: 实现方式:Eclipse搭配JSmooth(免费). 1.先由Eclips ...

  7. 项目开发中的一些注意事项以及技巧总结 基于Repository模式设计项目架构—你可以参考的项目架构设计 Asp.Net Core中使用RSA加密 EF Core中的多对多映射如何实现? asp.net core下的如何给网站做安全设置 获取服务端https证书 Js异常捕获

    项目开发中的一些注意事项以及技巧总结   1.jquery采用ajax向后端请求时,MVC框架并不能返回View的数据,也就是一般我们使用View().PartialView()等,只能返回json以 ...

  8. C++类型转换运算符 static_cast,dynamic_cast,reinterpret_cast,const_cast

    类型转换是一种让程序猿可以临时或永久性改变编译器对对象的解释机制.可改变对象解释方式的运算符称为类型转换运算符. 为何须要进行类型转换 通常为了实现使用不同环境的个人和厂商编写的模块可以相互调用和协作 ...

  9. HDU 1014 Uniform Generator 题解

    找到规律之后本题就是水题了.只是找规律也不太easy的.证明这个规律成立更加不easy. 本题就是求step和mod假设GCD(最大公约数位1)那么就是Good Choice,否则为Bad Choic ...

  10. POJ 1731 Orders(STL运用)

    题目地址:POJ 1731 这题能够直接用STL函数做,非常轻松..next_permutation函数非常给力.. 代码例如以下: #include <algorithm> #inclu ...