【问题标题】:PHP JSON Google Definitions - accessing a valuePHP JSON Google 定义 - 访问值
【发布时间】:2013-07-26 21:59:26
【问题描述】:

EDIT#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))

以上是我能做的最好的,我只是不断收到错误,试图返回那个文本节点说它是未定义的。如果可能的话,我更喜欢使用对象而不是关联数组,所以请避免告诉我将其设置为返回关联数组。

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

编辑:

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

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

我试图将值打印出来的错误是

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

EDIT#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 :(

【问题讨论】:

  • 堆栈溢出不是“板”。当然,这也是最重要的一点。
  • PHP 代码的其余部分在哪里?
  • 您需要显示 var_dump 或 print_r($json) 以验证它已成功解码。

标签: php json


【解决方案1】:

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

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

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

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

数组中的第一项索引是0 而不是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);

【讨论】:

  • 嗨,感谢您的帮助,这似乎使我走上了理解符号的正确道路,但是我仍然收到此错误: PHP Notice: Trying to get property of non-object in / home/outil2/Plugins/GDefine.php 在第 23 行
  • 啊,我不小心没有把它放在编辑过的代码上。但是,我现在在 var_dump 中打印了一个 NULL 结果 - 这是否表明 json 结果无效?
  • 是的,如果解码失败返回NULL。这很奇怪,因为根据 linter,您的 pastebin 中的 JSON 是有效的。
  • 我认为我的 substr 语句似乎很好,并且我通过将未解码的 var_dump 粘贴到 json 格式化程序中得到了有效的结果...
  • 刚刚开始工作,你必须转义一些字符,我再次更新了答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多