2015-12-03 104 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正確地拒絕它 –

相關問題