我刚刚开始使用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而不编写代码来摆脱括号?
答案 0 :(得分:3)
您应该在您提供的用于访问数据的网址中使用回调参数。因为数据交换格式是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 :(得分:1)
我认为PHP json_encode
是"对",您发布的第一个链接返回的值是不是有效的JSON,但似乎只是一个片段用于变量赋值的javascript代码。
实际上是JSON specification,它明确指出JSON对象必须以{
开头,以}
结尾