JSON解析,求高手

lanmolsz 2014-04-13 02:40:46


将下面这段JSON解析成js对象。
语法:

{"$ref":"$"} // 引用根对象
{"$ref":"@"} // 引用自己
{"$ref":".."} // 引用父对象
{"$ref":"../.."} // 引用父对象的父对象
{"$ref":"$.member[0].to"} // 基于路径的引用
求高手!!
{
"from": {
"city": "南京",
"province": "江苏"
},
"grilFriend": {
"boyFriend": {
"$ref": ".."
},
"from": {
"$ref": "$.from"
},
"language": "English",
"name": "章泽天",
"self": {
"$ref": "@"
},
"to": {
"city": "中关村",
"member": {
"$ref": "$"
},
"province": "北京"
}
},
"language": "汉语",
"name": "刘强东",
"self": {
"$ref": "@"
},
"to": {
"$ref": "$.grilFriend.to"
}
}
...全文
384 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
lanmolsz 2014-04-13
  • 打赏
  • 举报
回复
引用 5 楼 q2979978 的回复:
[quote=引用 4 楼 q2979978 的回复:] 简单写了一个。http://jsfiddle.net/VBgQF/
var obj = {
	path : '/',
	"from" : {
		path : '/from',
		"city" : "南京",
		"province" : "江苏"
	},
	"grilFriend" : {
		path : '/grilFriend',
		"boyFriend" : {
			path : '/grilFriend/boyFriend',
			"$ref" : ".."
		},
		"from" : {
			path : '/grilFriend/from',
			"$ref" : "$.from"
		},
		"language" : "English",
		"name" : "章泽天",
		"self" : {
			path : '/grilFriend/self',
			"$ref" : "@"
		},
		"to" : {
			path : '/grilFriend/to',
			"city" : "中关村",
			"member" : {
				path : '/grilFriend/to/member',
				"$ref" : "$"
			},
			"province" : "北京"
		}
	},
	"language" : "汉语",
	"name" : "刘强东",
	"self" : {
		path : '/self',
		"$ref" : "@"
	},
	"to" : {
		path : '/to',
		"$ref" : "$.grilFriend.to"
	}
};

//入口
var parse = function(o, root) {
	root = root == null ? o : root;
	var _ref;
	for (var i in o) {
		if (o.hasOwnProperty(i)) {
			o[i]['_parent'] = o;
			if (i == '$ref') {
				_ref = computeRef(o[i], o, obj);
			} else if ( typeof (o[i]) == 'object' && i != '_parent') {
				parse(o[i], root);
			}
		}
	}
	if (_ref) {
		o['$ref'] = _ref;
	}
	return o;
};

var computeRef = function(regx, o, root) {
	if (regx == '@') {
		return o
	} else if (regx[0] == '$') {
		if (regx.length == 1) {
			return root
		} else {
			var path = regx.split('.');
			path.splice(0, 1);
			return getNode(root, path)
		}
	} else if (regx.slice(0, 2) == '..') {//认定lz的路径书写格式为../../..   没有做过多处理
		var l = regx.split('/').length, p = o;
		for (var i = 0; i < l; i++) {
			if (p['_parent'])
				p = p['_parent'];
		}
		return p
	}
}
var getNode = function(node, path) {
	if (path.length == 0) {
		return node
	}
	var o = node[path[0]];
	path.splice(0, 1);
	return o ? getNode(o, path) : node
}

console.log(parse(obj));
加了path跟逻辑无关。只为方便调试- -。[/quote] 加了一个对象clone的方法就可以了,我开始直接复制就不行
lanmolsz 2014-04-13
  • 打赏
  • 举报
回复
引用 4 楼 q2979978 的回复:
简单写了一个。http://jsfiddle.net/VBgQF/
var obj = {
	path : '/',
	"from" : {
		path : '/from',
		"city" : "南京",
		"province" : "江苏"
	},
	"grilFriend" : {
		path : '/grilFriend',
		"boyFriend" : {
			path : '/grilFriend/boyFriend',
			"$ref" : ".."
		},
		"from" : {
			path : '/grilFriend/from',
			"$ref" : "$.from"
		},
		"language" : "English",
		"name" : "章泽天",
		"self" : {
			path : '/grilFriend/self',
			"$ref" : "@"
		},
		"to" : {
			path : '/grilFriend/to',
			"city" : "中关村",
			"member" : {
				path : '/grilFriend/to/member',
				"$ref" : "$"
			},
			"province" : "北京"
		}
	},
	"language" : "汉语",
	"name" : "刘强东",
	"self" : {
		path : '/self',
		"$ref" : "@"
	},
	"to" : {
		path : '/to',
		"$ref" : "$.grilFriend.to"
	}
};

//入口
var parse = function(o, root) {
	root = root == null ? o : root;
	var _ref;
	for (var i in o) {
		if (o.hasOwnProperty(i)) {
			o[i]['_parent'] = o;
			if (i == '$ref') {
				_ref = computeRef(o[i], o, obj);
			} else if ( typeof (o[i]) == 'object' && i != '_parent') {
				parse(o[i], root);
			}
		}
	}
	if (_ref) {
		o['$ref'] = _ref;
	}
	return o;
};

var computeRef = function(regx, o, root) {
	if (regx == '@') {
		return o
	} else if (regx[0] == '$') {
		if (regx.length == 1) {
			return root
		} else {
			var path = regx.split('.');
			path.splice(0, 1);
			return getNode(root, path)
		}
	} else if (regx.slice(0, 2) == '..') {//认定lz的路径书写格式为../../..   没有做过多处理
		var l = regx.split('/').length, p = o;
		for (var i = 0; i < l; i++) {
			if (p['_parent'])
				p = p['_parent'];
		}
		return p
	}
}
var getNode = function(node, path) {
	if (path.length == 0) {
		return node
	}
	var o = node[path[0]];
	path.splice(0, 1);
	return o ? getNode(o, path) : node
}

console.log(parse(obj));
我测试了一下感觉还是有一点点问题,就是应该替换他本身的而不是将对象赋值给ref这个属性
lanmolsz 2014-04-13
  • 打赏
  • 举报
回复
引用 5 楼 q2979978 的回复:
[quote=引用 4 楼 q2979978 的回复:] 简单写了一个。http://jsfiddle.net/VBgQF/
var obj = {
	path : '/',
	"from" : {
		path : '/from',
		"city" : "南京",
		"province" : "江苏"
	},
	"grilFriend" : {
		path : '/grilFriend',
		"boyFriend" : {
			path : '/grilFriend/boyFriend',
			"$ref" : ".."
		},
		"from" : {
			path : '/grilFriend/from',
			"$ref" : "$.from"
		},
		"language" : "English",
		"name" : "章泽天",
		"self" : {
			path : '/grilFriend/self',
			"$ref" : "@"
		},
		"to" : {
			path : '/grilFriend/to',
			"city" : "中关村",
			"member" : {
				path : '/grilFriend/to/member',
				"$ref" : "$"
			},
			"province" : "北京"
		}
	},
	"language" : "汉语",
	"name" : "刘强东",
	"self" : {
		path : '/self',
		"$ref" : "@"
	},
	"to" : {
		path : '/to',
		"$ref" : "$.grilFriend.to"
	}
};

//入口
var parse = function(o, root) {
	root = root == null ? o : root;
	var _ref;
	for (var i in o) {
		if (o.hasOwnProperty(i)) {
			o[i]['_parent'] = o;
			if (i == '$ref') {
				_ref = computeRef(o[i], o, obj);
			} else if ( typeof (o[i]) == 'object' && i != '_parent') {
				parse(o[i], root);
			}
		}
	}
	if (_ref) {
		o['$ref'] = _ref;
	}
	return o;
};

var computeRef = function(regx, o, root) {
	if (regx == '@') {
		return o
	} else if (regx[0] == '$') {
		if (regx.length == 1) {
			return root
		} else {
			var path = regx.split('.');
			path.splice(0, 1);
			return getNode(root, path)
		}
	} else if (regx.slice(0, 2) == '..') {//认定lz的路径书写格式为../../..   没有做过多处理
		var l = regx.split('/').length, p = o;
		for (var i = 0; i < l; i++) {
			if (p['_parent'])
				p = p['_parent'];
		}
		return p
	}
}
var getNode = function(node, path) {
	if (path.length == 0) {
		return node
	}
	var o = node[path[0]];
	path.splice(0, 1);
	return o ? getNode(o, path) : node
}

console.log(parse(obj));
加了path跟逻辑无关。只为方便调试- -。[/quote] 感动得要哭了,真是中国好网友,谢谢。 我后面问到朋友了,他说一个DOJO貌似可以解决,搜索了一下http://www.oschina.net/question/109503_120507 最后,真心感谢这位高智商网友。
jeff_jiang 2014-04-13
  • 打赏
  • 举报
回复
引用 4 楼 q2979978 的回复:
简单写了一个。http://jsfiddle.net/VBgQF/
var obj = {
	path : '/',
	"from" : {
		path : '/from',
		"city" : "南京",
		"province" : "江苏"
	},
	"grilFriend" : {
		path : '/grilFriend',
		"boyFriend" : {
			path : '/grilFriend/boyFriend',
			"$ref" : ".."
		},
		"from" : {
			path : '/grilFriend/from',
			"$ref" : "$.from"
		},
		"language" : "English",
		"name" : "章泽天",
		"self" : {
			path : '/grilFriend/self',
			"$ref" : "@"
		},
		"to" : {
			path : '/grilFriend/to',
			"city" : "中关村",
			"member" : {
				path : '/grilFriend/to/member',
				"$ref" : "$"
			},
			"province" : "北京"
		}
	},
	"language" : "汉语",
	"name" : "刘强东",
	"self" : {
		path : '/self',
		"$ref" : "@"
	},
	"to" : {
		path : '/to',
		"$ref" : "$.grilFriend.to"
	}
};

//入口
var parse = function(o, root) {
	root = root == null ? o : root;
	var _ref;
	for (var i in o) {
		if (o.hasOwnProperty(i)) {
			o[i]['_parent'] = o;
			if (i == '$ref') {
				_ref = computeRef(o[i], o, obj);
			} else if ( typeof (o[i]) == 'object' && i != '_parent') {
				parse(o[i], root);
			}
		}
	}
	if (_ref) {
		o['$ref'] = _ref;
	}
	return o;
};

var computeRef = function(regx, o, root) {
	if (regx == '@') {
		return o
	} else if (regx[0] == '$') {
		if (regx.length == 1) {
			return root
		} else {
			var path = regx.split('.');
			path.splice(0, 1);
			return getNode(root, path)
		}
	} else if (regx.slice(0, 2) == '..') {//认定lz的路径书写格式为../../..   没有做过多处理
		var l = regx.split('/').length, p = o;
		for (var i = 0; i < l; i++) {
			if (p['_parent'])
				p = p['_parent'];
		}
		return p
	}
}
var getNode = function(node, path) {
	if (path.length == 0) {
		return node
	}
	var o = node[path[0]];
	path.splice(0, 1);
	return o ? getNode(o, path) : node
}

console.log(parse(obj));
加了path跟逻辑无关。只为方便调试- -。
jeff_jiang 2014-04-13
  • 打赏
  • 举报
回复
简单写了一个。http://jsfiddle.net/VBgQF/
var obj = {
	path : '/',
	"from" : {
		path : '/from',
		"city" : "南京",
		"province" : "江苏"
	},
	"grilFriend" : {
		path : '/grilFriend',
		"boyFriend" : {
			path : '/grilFriend/boyFriend',
			"$ref" : ".."
		},
		"from" : {
			path : '/grilFriend/from',
			"$ref" : "$.from"
		},
		"language" : "English",
		"name" : "章泽天",
		"self" : {
			path : '/grilFriend/self',
			"$ref" : "@"
		},
		"to" : {
			path : '/grilFriend/to',
			"city" : "中关村",
			"member" : {
				path : '/grilFriend/to/member',
				"$ref" : "$"
			},
			"province" : "北京"
		}
	},
	"language" : "汉语",
	"name" : "刘强东",
	"self" : {
		path : '/self',
		"$ref" : "@"
	},
	"to" : {
		path : '/to',
		"$ref" : "$.grilFriend.to"
	}
};

//入口
var parse = function(o, root) {
	root = root == null ? o : root;
	var _ref;
	for (var i in o) {
		if (o.hasOwnProperty(i)) {
			o[i]['_parent'] = o;
			if (i == '$ref') {
				_ref = computeRef(o[i], o, obj);
			} else if ( typeof (o[i]) == 'object' && i != '_parent') {
				parse(o[i], root);
			}
		}
	}
	if (_ref) {
		o['$ref'] = _ref;
	}
	return o;
};

var computeRef = function(regx, o, root) {
	if (regx == '@') {
		return o
	} else if (regx[0] == '$') {
		if (regx.length == 1) {
			return root
		} else {
			var path = regx.split('.');
			path.splice(0, 1);
			return getNode(root, path)
		}
	} else if (regx.slice(0, 2) == '..') {//认定lz的路径书写格式为../../..   没有做过多处理
		var l = regx.split('/').length, p = o;
		for (var i = 0; i < l; i++) {
			if (p['_parent'])
				p = p['_parent'];
		}
		return p
	}
}
var getNode = function(node, path) {
	if (path.length == 0) {
		return node
	}
	var o = node[path[0]];
	path.splice(0, 1);
	return o ? getNode(o, path) : node
}

console.log(parse(obj));
lanmolsz 2014-04-13
  • 打赏
  • 举报
回复
引用 1 楼 microlab2009 的回复:
你的需求是要取到$ref的所有值?
其实只要拿到JSON的node路径这个问题也好解决!
lanmolsz 2014-04-13
  • 打赏
  • 举报
回复
引用 1 楼 microlab2009 的回复:
你的需求是要取到$ref的所有值?
可以这么说,但是不确切。更加明确的需求是将上面字串转为JS对象,第一步我们可以直接eval就可以,但是得到的对象也不是最终对象。
嘻哈大咖秀 2014-04-13
  • 打赏
  • 举报
回复
你的需求是要取到$ref的所有值?

87,907

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧