Javascript jQuery JSON解析-意外的令牌错误
我正在尝试使用envatoapi收集一些用户统计数据w/jQuery。我将展示一个JSON响应示例:Javascript jQuery JSON解析-意外的令牌错误,javascript,jquery,json,api,Javascript,Jquery,Json,Api,我正在尝试使用envatoapi收集一些用户统计数据w/jQuery。我将展示一个JSON响应示例: { "new-files-from-user":[ { "thumbnail":"http://3.s3.envato.com/files/60560.jpg", "tags":"", "user":"collis", "url":"http://themeforest.net/item/manilla-photoshop-design/22803",
{
"new-files-from-user":[
{
"thumbnail":"http://3.s3.envato.com/files/60560.jpg",
"tags":"",
"user":"collis",
"url":"http://themeforest.net/item/manilla-photoshop-design/22803",
"live_preview_url":"http://2.s3.envato.com/files/60561/1_Home.__large_preview.jpg",
"uploaded_on":"Wed Dec 03 03:32:35 +1100 2008",
"cost":"10.00",
"item":"Manilla Photoshop Design",
"sales":"294",
"rating":"4",
"id":"22803"
},
{
"thumbnail":"http://2.s3.envato.com/files/60223.jpg",
"tags":"clean",
"user":"collis",
"url":"http://themeforest.net/item/black-white-simple-theme/22705",
"live_preview_url":"http://0.s3.envato.com/files/60224/1_home.__large_preview.jpg",
"uploaded_on":"Tue Dec 02 04:01:12 +1100 2008",
"cost":"8.00","item":"Black + White Simple Theme",
"sales":"272","
rating":"4",
"id":"22705"
},
{
"thumbnail":"http://1.s3.envato.com/files/44556.jpg",
"tags":"clean",
"user":"collis",
"url":"http://themeforest.net/item/quik-v1-admin-skin/17314",
"live_preview_url":"http://3.s3.envato.com/files/44557/1_green.__large_preview.jpg",
"uploaded_on":"Fri Sep 05 07:30:24 +1000 2008","cost":"12.00",
"item":"Quik v1 Admin Skin",
"sales":"336",
"rating":"5",
"id":"17314"
},
{"thumbnail":"http://3.s3.envato.com/files/45212.jpg",
"tags":"clean",
"user":"collis",
"url":"http://themeforest.net/item/freshcorp-business-template/17528",
"live_preview_url":"http://3.s3.envato.com/files/45213/1_Homepage.__large_preview.jpg",
"uploaded_on":"Tue Sep 09 06:10:50 +1000 2008",
"cost":"20.00",
"item":"FreshCorp - Business Template",
"sales":"277",
"rating":"4","id":"17528"
},
{"thumbnail":"http://0.s3.envato.com/files/45739.jpg",
"tags":"clean",
"user":"collis",
"url":"http://themeforest.net/item/real-estate-html-template/17732",
"live_preview_url":"http://0.s3.envato.com/files/45740/1_homepage.__large_preview.jpg",
"uploaded_on":"Fri Sep 12 14:22:45 +1000 2008",
"cost":"20.00","item":"Real Estate HTML Template",
"sales":"175",
"rating":"4",
"id":"17732"
}
]
}
这是我的剧本:
<script type="text/javascript">
//this gets JSON data from an url
$.getJSON("http://marketplace.envato.com/api/edge/new-files-from-user:collins,themeforest.json?callback=?",
//this function gets called when data has been recieved
function(data){
//parsing JSON data, line by line(like foreach)
$.each(data['new-items-from-user'], function(i,item){
//puts all titles in our div
$("#test").append(item.item+"<br />");
});
});
</script>
<div id="test"></div>
//这将从url获取JSON数据
$.getJSON(“http://marketplace.envato.com/api/edge/new-files-from-user:collins,themeforest.json?callback=?“,
//此函数在收到数据时调用
功能(数据){
//逐行解析JSON数据(如foreach)
$.each(数据['new-items-from-user'],函数(i,项){
//将所有标题放入我们的分区中
$(“#测试”)。追加(item.item+”
);
});
});
下面是我在Chrome控制台中得到的信息:“未捕获的语法错误:意外标记:”(图)
我不确定我的代码中是否有导致此问题的错误,但这里有一个小提琴来查看结果:
谢谢,
Matt < /P> < P>在JSON响应列表中的第二个对象中,属性名称中间有一个断线:
"sales":"272","
rating":"4",
"id":"22705"
也许那只是一个转录错误
编辑-确定,这是一个转录错误。我认为问题在于你所访问的网站并没有真正正确地理解JSONP。它返回的JSON看起来不错,但JSONP要求返回的JSON包在函数调用中。换句话说,响应应该如下所示:
somefunction({"new-items-from-user":[{ ... }]});
它没有这样做,所以当JSON被自己计算时,它就构成了一个语法错误,因为JavaScript认为前导的{
是代码块的开始,而不是对象文本
查看该API的文档,我没有发现任何迹象表明它打算用作JSONP服务。看起来他们打算从手机应用程序或web服务器之类的东西中使用它,但不是通过JSONP从浏览器中的JavaScript中使用它。一个可能的问题是,代码有:
data['new-items-from-user']
但数据如下所示:
{"new-files-from-user":[]}
正如@Pointy所说,响应并没有被解析为json,而是被解析为脚本。所以执行
eval
函数
eval('{"new-files-from-user":[]}');
这是一个错误
对于jsonp,如果url是http://marketplace.envato.com/api/edge/new-files-from-user:mechabyte,themeforest.json,调用应按如下方式进行
http://marketplace.envato.com/api/edge/new-files-from-user:mechabyte,themeforest.json?callback=mycallback
而回应应该是
mycallback({"new-files-from-user":[]});
({"new-files-from-user":[]});
jQuery171009222313176259944_1327017091413({"new-files-from-user":[]});
如果你有一个函数mycallback
eval('mycallback({"new-files-from-user":[]});');
行得通
或者如果您没有设置回调
http://marketplace.envato.com/api/edge/new-files-from-user:mechabyte,themeforest.json?callback=
答案应该是
mycallback({"new-files-from-user":[]});
({"new-files-from-user":[]});
jQuery171009222313176259944_1327017091413({"new-files-from-user":[]});
然后
行得通
在您的例子中,您可以看到每次jQuery都在设置参数callback
like
callback=jQuery171009222313176259944_1327017091413
因此,答案应该是肯定的
mycallback({"new-files-from-user":[]});
({"new-files-from-user":[]});
jQuery171009222313176259944_1327017091413({"new-files-from-user":[]});
e、 g:
但由于响应是一个json字符串,因此这将起作用。(根据同源策略)
url中的
:
会导致错误,可能是因为jQuery解析了它,不喜欢它,也可能是XHR对象本身不喜欢它。有解决方法吗?你认为url编码可以解决这个问题吗?编辑:在Chrome控制台上,它说它从JSON提要中获取错误,我将用图片更新我的帖子不确定这是否是relevant或:我的safari客户端抱怨资源是用MIME类型的应用程序/八位字节流发送的。这听起来不对,是吗?我认为URL末尾的问号是一个问题。如果您删除它,错误消息会发生变化。它们的工作方式相同。我更新了我的小提琴,当jQuery尝试readi时,我发现了错误ng JSON提要为什么会有问题?属性名是“用户的新文件”,在代码中它是如何被访问的。是的,这是我的代码,但我不知道为什么会出现错误。::我没有看到JSON有任何错误,但我仍在尝试一些事情。