JSON格式问题

zhaohuihua 2010-09-19 10:24:34
项目中有一个通用的类负责将对象转换为JSON字符串以供AJAX调用
之前项目未采用jQuery,一直以JavaScript的eval()来解析JSON字符串
但最近ADMIN模块开始采用jQuery-1.4.2,却发现jQuery.parseJSON解析不了之前的字符串
以eval()解析时,JSON字符串必须以括号括起来
而以jQuery.parseJSON解析时最外层不能有括号


请问JSON的标准写法要不要带括号?
个人理解应该是不需要带括号吧,为什么eval()解析时必须带?(而且各浏览器表现一致)



<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>Test</title>
<script type="text/javascript" src="jquery-1.4.2.js"></script>
<script type="text/javascript">
$(function() {
var txt1 = "({\"list\":[{\"id\":\"1000000001\", \"name\":\"Stephen\"},{\"id\":\"1000000002\", \"name\":\"Clare\"}], \"returnCode\":\"000000\", \"message\":\"成功\"})";
try {
var json = eval(txt1);
$("#msg").append("<p>eval解析带括号Json成功:"+json.returnCode+"</p>");
} catch(e) {
$("#msg").append("<p>eval解析带括号Json出错</p>");
}
try {
var json = $.parseJSON(txt1);
$("#msg").append("<p>jQuery解析带括号Json成功:"+json.returnCode+"</p>");
} catch(e) {
$("#msg").append("<p>jQuery解析带括号Json出错</p>");
}

var txt2 = "{\"list\":[{\"id\":\"1000000001\", \"name\":\"Stephen\"},{\"id\":\"1000000002\", \"name\":\"Clare\"}], \"returnCode\":\"000000\", \"message\":\"成功\"}";
try {
var json = eval(txt2);
$("#msg").append("<p>eval解析不带括号Json成功:"+json.returnCode+"</p>");
} catch(e) {
$("#msg").append("<p>eval解析不带括号Json出错</p>");
}
try {
var json = $.parseJSON(txt2);
$("#msg").append("<p>jQuery解析不带括号Json成功:"+json.returnCode+"</p>");
} catch(e) {
$("#msg").append("<p>jQuery解析不带括号Json出错</p>");
}
});
</script>
</head>

<body>
<div id="msg"></div>
</body>
</html>
...全文
1018 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
yeyehei520 2012-10-19
  • 打赏
  • 举报
回复
好像很有道理。。。。
zhaohuihua 2010-11-19
  • 打赏
  • 举报
回复
wula0010 总是不理解我说的话
难道我说的不清楚??? 呜......

参与有分,结帐迟了...
zhaohuihua 2010-11-19
  • 打赏
  • 举报
回复
楼上的有些道理
rainsilence 2010-10-05
  • 打赏
  • 举报
回复
json标准写法不需要()

加了括号的写法是
var test = {name: 'tets'};

var testJson = eval("(" + test + ")");

不加括号的写法是

eval("var testJson=" + test);

括号在这里就是让eval认为他是个独立的对象。
(function(){})();
跟上面的第一个括号的用法相似
zhaohuihua 2010-10-05
  • 打赏
  • 举报
回复
为什么eval()解析JSON字符串时必须在最外层加()小括号?
  • 打赏
  • 举报
回复
学习,没仔细研究过
码之魂 2010-09-26
  • 打赏
  • 举报
回复
晕死,这个还用问?

那是eval这个函数的问题,和json无关,你应该查eval()而不是去查json!
zhaohuihua 2010-09-26
  • 打赏
  • 举报
回复
JSON最外层应该是不需要加()小括号的
http://www.json.org/json-zh.html
对象是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。

为什么eval()解析JSON字符串时必须在最外层加()小括号?
否则就会报错!很奇怪!
yuan22443 2010-09-20
  • 打赏
  • 举报
回复
用单引号嘛。。
zhaohuihua 2010-09-20
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 flybird 的回复:]
标准的是要带括号的
[/Quote]
你指的是要带这种{}大括号,而不是这种()小括号吧
我指的是eval解析时要带()小括号,而jQuery.parseJSON解析时带()小括号就会报错
futrueing 2010-09-20
  • 打赏
  • 举报
回复
正准备学习中~
zhaohuihua 2010-09-20
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 wula0010 的回复:]

引用 10 楼 zhaohuihua 的回复:
jQuery1.4之前的版本是通过eval()解析JSON字符串的


我现在用的是jquery 1.3.2,解析json不需要eval(),直接:
$.getJSON(B,encodeURI(S),function(O){... ...})............
[/Quote]
我的意思是jQuery1.4之前的版本内部是通过eval()解析JSON字符串的

if ( type == "json" )
data = window["eval"]("(" + data + ")");
chooseforget 2010-09-20
  • 打赏
  • 举报
回复
不带小括号的话,JS把JSON的内容当做一个JavaScript对象来处理。 个人理解是这样。因为不带小括号的JSON就是一个JavaScript对象形式(有属性,有值)。
wula0010 2010-09-20
  • 打赏
  • 举报
回复
这说明jquery的getJSON方法处理了eval(),仅此而已,..........
wula0010 2010-09-20
  • 打赏
  • 举报
回复
当然,如果你不用getJSON,用post提交,需要用eval()解析:
$.post(B,encodeURI(S),function(O){var R=eval("("+O+")");......})
wula0010 2010-09-20
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 zhaohuihua 的回复:]
jQuery1.4之前的版本是通过eval()解析JSON字符串的
[/Quote]

我现在用的是jquery 1.3.2,解析json不需要eval(),直接:
$.getJSON(B,encodeURI(S),function(O){... ...})............
zhaohuihua 2010-09-20
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wula0010 的回复:]
javascrip不是旧版本的jquery,......................
[/Quote]
jQuery1.4之前的版本是通过eval()解析JSON字符串的
zhaohuihua 2010-09-20
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 huminghua 的回复:]
标准的Json字符串是要带括号的,{success:true},{["ID","1"],["Name","小小"]}
[/Quote]
var txt1 = "({\"list\":[{\"id\":\"1000000001\", \"name\":\"Stephen\"},{\"id\":\"1000000002\", \"name\":\"Clare\"}], \"returnCode\":\"000000\", \"message\":\"成功\"})";
我所指的括号是小括号()
tianc_02678 2010-09-20
  • 打赏
  • 举报
回复
js 的 eval 带()是为了避免json字符串产生歧义。
huminghua 2010-09-20
  • 打赏
  • 举报
回复
标准的Json字符串是要带括号的,{success:true},{["ID","1"],["Name","小小"]}
加载更多回复(5)

81,092

社区成员

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

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