Javascript 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",

我正在尝试使用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",
    "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有任何错误,但我仍在尝试一些事情。