【问题标题】:json_decode() returning error "Notice: Trying to get property of non-object"json_decode() 返回错误“注意:试图获取非对象的属性”
【发布时间】:2014-10-01 10:22:39
【问题描述】:

我正在尝试编写一个脚本,该脚本使用 cURL 从远程位置(在本例中为 twitch.tv)获取 JSON 文件(不要认为该部分太相关,尽管我最好还是提一下)。例如,假设它返回的 JSON 对象在存储在变量中后看起来像这样:

$json_object = {"_links":{"self":"https://api.twitch.tv/kraken/streams/gmansoliver","channel":"https://api.twitch.tv/kraken/channels/gmansoliver"},"stream":null}

我访问“流”属性,我尝试了以下代码:

<?php
    $json_object = {"_links":{"self":"https://api.twitch.tv/kraken/streams/gmansoliver","channel":"https://api.twitch.tv/kraken/channels/gmansoliver"},"stream":null}

    $json_decoded = json_decode($json_object, true);
    echo $json_decoded->stream;
?>

当我尝试这个时,我收到错误“注意:尝试在第 48 行获取 D:\Servers\IIS\Sites\mysite\getstream.php 中非对象的属性”。

是我使用 json_decode() 错误,还是我从 twitch 发送的 JSON 对象有问题?

编辑:

我现在有了 JSON 对象:

{"access_token": "qwerty1235","refresh_token": "asdfghjkl=","scope": ["user_read"]}

如果我尝试使用 json_decode() 对其进行解码,则会收到以下错误:Object of class stdClass could not be converted to string。有什么建议吗?

提前感谢您的帮助

【问题讨论】:

  • json_decode中删除第二个参数。
  • 那个json_decode($jsonString)会返回一个stdClass,但是当添加一个true参数时它会返回一个数组。
  • 哇,真不敢相信我没听懂。我虽然该参数用于关联事物,但猜测仅适用于数组。介意将其发布为答案,以便我可以将其标记为这样吗?

标签: php json twitch


【解决方案1】:

您已将json_decode() 的第二个参数($assoc) 设置为true,这意味着它将返回一个关联数组而不是一个对象。然后,您尝试引用对象样式。如果将第二个参数设置为 true,则需要使用关联数组样式来访问流内容。应该是:

$json_decoded['stream']

如果将 $assoc 参数设置为 false(或不指定参数),则可以将其作为对象引用:

$json_decoded->stream

如果您对 $json_decoded 变量执行var_dump,您将看到它的样子。这是查看您正在处理的内容的好方法。

【讨论】:

    【解决方案2】:

    您正在将 JSON 解码为一个数组。 json_decode($json_object, true); 将返回一个数组

    array (size=2)
      '_links' => 
        array (size=2)
          'self' => string 'https://api.twitch.tv/kraken/streams/gmansoliver' (length=48)
          'channel' => string 'https://api.twitch.tv/kraken/channels/gmansoliver' (length=49)
      'stream' => null
    

    如果你删除第二个参数并以json_decode($json_object)运行它

    object(stdClass)[1]
      public '_links' => 
        object(stdClass)[2]
          public 'self' => string 'https://api.twitch.tv/kraken/streams/gmansoliver' (length=48)
          public 'channel' => string 'https://api.twitch.tv/kraken/channels/gmansoliver' (length=49)
      public 'stream' => null
    

    See the documentation,当为TRUE时,返回的对象将被转换为关联数组。

    【讨论】:

    • 我现在有了 JSON 对象 {"access_token":"qwerty12345","refresh_token":"asdfghjk=","scope":["user_read"]}。如果我尝试使用json_decode() 对其进行解码,则会收到以下错误:Object of class stdClass could not be converted to string。有什么建议吗?
    • 那不是有效的 json
    • 有什么理由想将它用作类而不是数组?
    • 你说得对,它是无效的 json,当我把它粘贴到这里时,它搞砸了。根据在线验证器,这个 json 似乎是正确的:{"access_token": "qwerty1235","refresh_token": "asdfghjkl=","scope": ["user_read"]}
    • 这对我仍然有效,但不确定你哪里出了问题。使用您刚刚在此处发布的 JSON,以 $data = json_decode($json_str, true); 运行它,然后您可以访问 access_token,如 $data['access_token']
    猜你喜欢
    • 1970-01-01
    • 2014-05-03
    • 1970-01-01
    • 2018-11-22
    相关资源
    最近更新 更多