2015-12-03 77 views
1

我刚开始使用JSON,有时候我还是有点头脑不清。为什么有时json输出用圆括号包装

当我检索this link数据,有一对括号包裹JSON字符串的(或对象字面):

({"book":[{"book_ref":"1 S","book_name":"1 Samuel","book_nr":"9","chapter_nr":"3","chapter":{"16":{"verse_nr":"16","verse":"\u4ee5 \u5229 \u547c \u5524 \u6492 \u6bcd \u8033 \u8bf4 \uff1a \u6211 \u513f \u6492 \u6bcd \u8033 \u554a \uff01 \u6492 \u6bcd \u8033 \u56de \u7b54 \u8bf4 \uff1a \u6211 \u5728 \u8fd9 \u91cc \uff01\r\n"}}}],"direction":"LTR","type":"verse","version":"cus"}); 

在我以往的经验,我从来没有见过这样的事情。 (例如,this link输出具有没有括号JSON字符串。)

出乎我的意料,看来我可以只使用它像往常一样在jQuery的:

jQuery.ajax({ 
    url:'http://getbible.net/json', 
    dataType: 'jsonp', 
    data: 'p=John1&v=kjv', 
    jsonp: 'getbible', 
    success:function(json){console.log(json)} 
}); 

但是,当我设法得到它使用PHP的file_get_contents(),然后json_decode(),括号似乎是在阻碍,json_decode()什么也没有返回。

那么圆括号的目的是什么?它与jsonp有关吗?无论如何,以PHP方式使用这种JSON而无需编写代码来摆脱括号?

回答

2

结束你应该在你的访问数据提供的网址中使用的回调参数。因为数据交换格式是jsonp。可能会添加那些括号,因为回调被评估为空字符串。

请参阅下面的例子和您提供的网址。

https://getbible.net/json?passage=1samuel3:16&v=cus&callback=foo //foo is the callback name 

它用回调名称foo返回数据。

foo({"book":[{"book_ref":"1 S","book_name":"1 Samuel","book_nr":"9","chapter_nr":"3","chapter":{"16":{"verse_nr":"16","verse":"\u4ee5 \u5229 \u547c \u5524 \u6492 \u6bcd \u8033 \u8bf4 \uff1a \u6211 \u513f \u6492 \u6bcd \u8033 \u554a \uff01 \u6492 \u6bcd \u8033 \u56de \u7b54 \u8bf4 \uff1a \u6211 \u5728 \u8fd9 \u91cc \uff01\r\n"}}}],"direction":"LTR","type":"verse","version":"cus"}); 

请参阅下面的示例来演示如何访问数据。

var url="https://getbible.net/json?passage=1samuel3:16&v=cus&"; 
var callbackname = "callback"; 
$.getJSON(url+'callback=' + callbackname, function(json){ 
    //loop through data 
    $.each(json.book,function(i,dat){ 
     document.write(dat.book_ref); //print the book reference "1 S" 
    }); 

}); 
1

我觉得这里PHP json_encode是“正确的”,由您发布的第一个链接返回的值是有效的JSON,而只是似乎JavaScript代码的变量赋值一个片段。

见其实JSON specification,其中明确指出,一个JSON对象必须{开始和}

+0

如果你问我,我会说这也是无效的JSON,但重点是,它工作!为什么? – shenkwen

+0

可能是因为'jQuery'尝试接受它,即使无效,而PHP正确地拒绝它 –

相关问题