我刚开始使用JSON,有时我还是有点不知所措。
当我从这个链接检索数据时,有一对括号包裹着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 uff01rn"}}}],"direction":"LTR","type":"verse","version":"cus"});
根据我过去的经验,我从未见过这样的事情。(例如,此链接输出一个没有括号的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,而不编写代码来去掉括号?
您应该在访问数据时提供的url中使用回调参数。因为数据交换格式是jsonp。添加这些括号可能是因为回调被计算为空字符串。
请使用您提供的url查看下面的示例。
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 uff01rn"}}}],"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"
});
});
我认为PHP json_encode
是"正确的",您发布的第一个链接返回的值是不是有效的JSON,而似乎只是变量赋值的javascript代码片段。
请参阅JSON规范,该规范明确规定JSON对象必须以{
开头,以}
结尾。