PHP JSON谷歌定义-访问值

PHP JSON谷歌定义-访问值,php,json,Php,Json,EDIT4:json_解码失败,并在看似有效的json字符串上返回null。有关更多信息,请参见下文 我是JSON/JSONP新手,在使用PHP访问返回的JSON中的值时经常遇到麻烦。我已经使用在这块板上找到的代码剥离了JSONP回调,没有任何问题。我从中得到了一个JSONP结果,并努力获取第一个结果的含义。这是一个相当复杂的结果,我需要从下面的JSON结果中访问节点文本中的第一个含义 我最好的尝试是: if (isset($json->primaries[1]->entries

EDIT4:json_解码失败,并在看似有效的json字符串上返回null。有关更多信息,请参见下文

我是JSON/JSONP新手,在使用PHP访问返回的JSON中的值时经常遇到麻烦。我已经使用在这块板上找到的代码剥离了JSONP回调,没有任何问题。我从中得到了一个JSONP结果,并努力获取第一个结果的含义。这是一个相当复杂的结果,我需要从下面的JSON结果中访问节点文本中的第一个含义

我最好的尝试是:

  if (isset($json->primaries[1]->entries[1]->terms[1]->text))
以上是我所能做的最好的,我只是在尝试返回文本节点时不断出现错误,说它未定义。如果可能的话,我更喜欢使用对象而不是关联数组,所以请避免告诉我将其设置为返回assoc数组

任何帮助都将不胜感激。我真的被卡住了:P

编辑:

$json->primaries[1]->entries[1]->terms[0]->text似乎也不起作用。这是完整的脚本。忽略$params数组,因为它没有被使用,我们将使用它来生成查询

该脚本在我第一次发布时就已经被编辑过,因为我有一个无效的JSON对象,但是这个错误似乎已经被修复,因为它现在将通过JSON格式化程序进行解析

我在打印值时遇到的错误是

PHP注意:尝试在第23行的/home/outil2/Plugins/GDefine.PHP中获取非对象的属性

EDIT2:添加了json_解码,这是我最初的解决方案,但在第二个版本中丢失了

<?php
class GDefine extends Plugin {

    public static $enabled = TRUE;

    public function onReceivedData($data) {
            if ($data["message"][0] == ".def") {
                    $params = array (
                            "callback" => "a",
                            "sl" => "en",
                            "tl" => "en",
                            "q" => $data["message"][1]
                    );

                    $jsonp = file_get_contents(
                            "http://www.google.com/dictionary/json?callback=a&sl=en&tl=en&q=" . $data["message"][1]);


                    $json = json_decode(substr($jsonp, 2, strlen($jsonp)-12));

                    var_dump($json);

                    print_r($json->primaries[1]->entries[1]->terms[0]->text);

                    if (isset($json->primaries[1]->entries[1]->terms[0]->text)) {

                            $text = $this->bold("Google Definition: ");
                            $text .= $this->teal($json->primaries[1]->entries[1]->terms[0]->text);
                            $this->privmsg($data["target"], $text);
                    } else {

                    $this->privmsg($data["target"], "error error error");

                    }
            }
    }
}

我对它进行解码,它返回NULL:

您试图访问一个不存在的对象。您的代码:

if (isset($json->primaries[1]->entries[1]->terms[1]->text)) // Doesn't exist
初选[1]的条目[1]中没有[1]项。只有一个项目;条款[0]。我认为这会起作用,例如:

if (isset($json->primaries[1]->entries[1]->terms[0]->text))
数组中的第一项由0而不是1索引,可能是您的错误

编辑: 您还需要解码JSON,更改:

$json = substr($jsonp, 2, strlen($jsonp)-12);
致:

编辑: 您还需要在JSON中转义一些未转义的字符。将此添加到您的代码中:

更改:

$json = json_decode(substr($jsonp, 2, strlen($jsonp)-12));
致:


堆栈溢出不是板。当然,这是最重要的一点。您的PHP代码的其余部分在哪里?您需要显示一个var_dump或print_r$json来验证它是否已成功解码。您好,感谢您的帮助,这似乎让我找到了理解符号的正确途径,但是我仍然会遇到这样的错误:PHP注意:试图在第23Ahhh行的/home/outil2/Plugins/GDefine.PHP中获取非对象的属性,我无意中没有在编辑的代码中添加该属性。然而,我现在在var_dump中得到一个NULL结果-这是否表示json结果无效?是的,如果解码失败,则返回NULL。这很奇怪,因为根据linter的说法,pastebin中的JSON是有效的。我认为我的substr语句似乎很好,而且我将未编码的var_转储粘贴到JSON格式化程序中,得到了有效的结果……只要让它工作起来,你必须转义一些字符,我已经再次更新了答案。
$json = json_decode(substr($jsonp, 2, strlen($jsonp)-12));
$json = json_decode(substr($jsonp, 2, strlen($jsonp)-12));
$json = substr($jsonp, 2, strlen($jsonp) - 12);
$json = str_replace("\\", "\\\\", $json);
$json = json_decode($json);