版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Esc_Tab_End/article/details/80348149
当存在要解析未知key的json数据时,我们就需要一个递归方法来实现解析操作。
1、定义一个json字符串。
var data = "{name:'尼古拉斯赵四',sex:'男',age:40,birth:{year:1978,month:5,day:21},test:[{'url':'www.baicu.com'},{'url':'www.tmall.com'},{'url':'www.taobao.com'}]}";
2、定义判断对象是不是json对象的函数和是不是数组的函数
//判断obj是否为json对象
function isJson(obj){
var isjson = typeof(obj) == "object" && Object.prototype.toString.call(obj).toLowerCase() == "[object object]" && !obj.length;
return isjson;
}
//判断是不是数组
function isArrayFn(o) {
return Object.prototype.toString.call(o) === '[object Array]';
}
3、递归函数
递归函数有三个要素:
① 一定有一种可以退出程序的情况;
② 总是在尝试将一个问题化简到更小的规模
③ 父问题与子问题不能有重叠的部分
function stack(obj){
if(!isJson(obj)){//退出条件:当对象不是json的时候推出
return obj;
}
//如果是json进行循环,取出键值对。逐渐减小问题的规模
for(var o in obj){
if(stack(obj[o])){//进行判断,进入子问题
if(isArrayFn(obj[o])){//判断是不是数组
var arr = obj[o];
for(var i = 0;i < arr.length;i++){
stack(arr[i]);//如果是数组,再判断数组里的数据是不是json。
}
}else{
console.info(o+":"+obj[o]);
}
}
}
}
4、当文档加载时调用的递归函数函数
window.onload = function(){
//使用eval函数将data字符串,转换成json对象。
stack(eval('('+data+')'));
}
5、效果: