1

编辑#4:json_decode 失败并在看似有效的 json 字符串上返回 null。有关更多信息,请参见下文

我是 JSON/JSONP 的新手,并且在使用 PHP 访问返回的 JSON 中的值时遇到了问题。我已经使用我在这个板上找到的代码毫无问题地剥离了 JSONP 回调。我从http://www.google.com/dictionary/json?callback=a&sl=en&tl=en&q=love获得 JSONP 结果,并努力获取第一个结果的含义。这是一个相当复杂的结果,我需要从下面的 JSON 结果中访问第一个含义(在节点“文本”中)。

http://pastebin.com/hBTeBTUL

我最好的尝试是:

  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 中获取非对象的属性

编辑#2:添加了我原来的解决方案中的 json_decode,但在第二个版本中丢失了

<?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");

                    }
            }
    }
}

编辑#3:这是我试图 json_decode 的字符串,在使用 substr 删除回调函数之后,但在 var_dump($json) 上返回了一个 NULL 值

{"query":"love","sourceLanguage":"en","targetLanguage":"en","primaries":[{"type":"headword","terms":[{"type":"text","text":"love","language":"en","labels":[{"text":"Noun","title":"Part-of-speech"}]},{"type":"phonetic","text":"/lÉv/","language":"und"},{"type":"sound","text":"http://www.gstatic.com/dictionary/static/sounds/de/0/love.mp3","language":"und"}],"entries":[{"type":"related","terms":[{"type":"text","text":"loves","language":"und","labels":[{"text":"plural"}]}]},{"type":"meaning","terms":[{"type":"text","text":"An intense feeling of deep affection","language":"en"}],"entries":[{"type":"example","terms":[{"type":"text","text":"babies fill parents with intense feelings of \x3cem\x3elove\x3c/em\x3e","language":"en"}]},{"type":"example","terms":[{"type":"text","text":"their \x3cb\x3e\x3cem\x3elove\x3c/em\x3e for\x3c/b\x3e their country","language":"en"}]}]},{"type":"meaning","terms":[{"type":"text","text":"A deep romantic or sexual attachment to someone","language":"en"}],"entries":[{"type":"example","terms":[{"type":"text","text":"it was \x3cem\x3elove\x3c/em\x3e at first sight","language":"en"}]},{"type":"example","terms":[{"type":"text","text":"they were both \x3cb\x3ein \x3cem\x3elove\x3c/em\x3e with\x3c/b\x3e her","language":"en"}]},{"type":"example","terms":[{"type":"text","text":"we were slowly \x3cb\x3efalling in \x3cem\x3elove\x3c/em\x3e\x3c/b\x3e","language":"en"}]}]},{"type":"meaning","terms":[{"type":"text","text":"A personified figure of \x3cem\x3elove\x3c/em\x3e, often represented as Cupid","language":"en"}]},{"type":"meaning","terms":[{"type":"text","text":"A great interest and pleasure in something","language":"en"}],"entries":[{"type":"example","terms":[{"type":"text","text":"his \x3cb\x3e\x3cem\x3elove\x3c/em\x3e for\x3c/b\x3e football","language":"en"}]},{"type":"example","terms":[{"type":"text","text":"we share a \x3cb\x3e\x3cem\x3elove\x3c/em\x3e of\x3c/b\x3e music","language":"en"}]}]},{"type":"meaning","terms":[{"type":"text","text":"Affectionate greetings conveyed to someone on one\x27s behalf","language":"en"}]},{"type":"meaning","terms":[{"type":"text","text":"A formula for ending an affectionate letter","language":"en"}],"entries":[{"type":"example","terms":[{"type":"text","text":"take care, lots of \x3cem\x3elove\x3c/em\x3e, Judy","language":"en"}]}]},{"type":"meaning","terms":[{"type":"text","text":"A person or thing that one \x3cem\x3eloves\x3c/em\x3e","language":"en"}],"entries":[{"type":"example","terms":[{"type":"text","text":"she was \x3cb\x3ethe \x3cem\x3elove\x3c/em\x3e of his life\x3c/b\x3e","language":"en"}]},{"type":"example","terms":[{"type":"text","text":"their two great \x3cem\x3eloves\x3c/em\x3e are tobacco and whiskey","language":"en"}]}]},{"type":"meaning","terms":[{"type":"text","text":"A friendly form of address","language":"en"}],"entries":[{"type":"example","terms":[{"type":"text","text":"it\x27s all right, \x3cem\x3elove\x3c/em\x3e","language":"en"}]}]},{"type":"meaning","terms":[{"type":"text","text":"Used to express affectionate approval for someone","language":"en"}],"entries":[{"type":"example","terms":[{"type":"text","text":"don\x27t fret, there\x27s a \x3cem\x3elove\x3c/em\x3e","language":"en"}]}]},{"type":"meaning","terms":[{"type":"text","text":"(in tennis, squash, and some other sports) A score of zero; nil","language":"en"}],"entries":[{"type":"example","terms":[{"type":"text","text":"\x3cem\x3elove\x3c/em\x3e fifteen","language":"en"}]},{"type":"example","terms":[{"type":"text","text":"he was down two sets to \x3cem\x3elove\x3c/em\x3e","language":"en"}]}]}]},{"type":"headword","terms":[{"type":"text","text":"love","language":"en","labels":[{"text":"Verb","title":"Part-of-speech"}]},{"type":"phonetic","text":"/lÉv/","language":"und"},{"type":"sound","text":"http://www.gstatic.com/dictionary/static/sounds/de/0/love.mp3","language":"und"}],"entries":[{"type":"related","terms":[{"type":"text","text":"loved","language":"und","labels":[{"text":"past participle"}]},{"type":"text","text":"loves","language":"und","labels":[{"text":"3rd person singular present"}]},{"type":"text","text":"loving","language":"und","labels":[{"text":"present participle"}]},{"type":"text","text":"loved","language":"und","labels":[{"text":"past tense"}]}]},{"type":"meaning","terms":[{"type":"text","text":"Feel a deep romantic or sexual attachment to (someone)","language":"en"}],"entries":[{"type":"example","terms":[{"type":"text","text":"do you \x3cem\x3elove\x3c/em\x3e me?","language":"en"}]}]},{"type":"meaning","terms":[{"type":"text","text":"Like very much; find pleasure in","language":"en"}],"entries":[{"type":"example","terms":[{"type":"text","text":"I\x27d \x3cem\x3elove\x3c/em\x3e a cup of tea, thanks","language":"en"}]},{"type":"example","terms":[{"type":"text","text":"I just \x3cem\x3elove\x3c/em\x3e dancing","language":"en"}]},{"type":"example","terms":[{"type":"text","text":"a fun-\x3cem\x3eloving\x3c/em\x3e girl","language":"en"}]}]}]}]}

我 json_decode 并返回 NULL :(

4

1 回答 1

0

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

if (isset($json->primaries[1]->entries[1]->terms[1]->text)) // Doesn't exist

里面没有。terms[1]_ 只有 1 项;. 我认为这将起作用,例如:entries[1]primaries[1]terms[0]

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

在此处输入图像描述

数组中的第一项由0not索引1,也许这是您的错误。

编辑:

您还需要解码JSON,更改:

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

至:

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

编辑:

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

改变:

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

至:

$json = substr($jsonp, 2, strlen($jsonp) - 12);
$json = str_replace("\\", "\\\\", $json);
$json = json_decode($json);
于 2013-07-26T11:08:45.017 回答