为什么有时json输出用括号括起来

时间:2015-12-03 21:18:18

标签: php 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 个答案:

答案 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对象必须以{开头,以}结尾