【问题标题】:PHP json_decode doesn`t workPHP json_decode 不起作用
【发布时间】:2014-12-18 16:18:55
【问题描述】:

您好,我想获取 Steam 用户的用户名 我已将数据存储在 .json 格式的文件中。

{
"response": {
    "players": [
        {
            "steamid": "76561198137714668",
            "communityvisibilitystate": 3,
            "profilestate": 1,
            "personaname": "UareBugged",
            "lastlogoff": 1418911040,
            "commentpermission": 1,
            "profileurl": "http://steamcommunity.com/id/uarenotbest/",
            "avatar": "http://cdn.akamai.steamstatic.com/steamcommunity/public/images/avatars/da/daece8a16d866ef9bd03ddc4aa365c5862af1c21.jpg",
            "avatarmedium": "http://cdn.akamai.steamstatic.com/steamcommunity/public/images/avatars/da/daece8a16d866ef9bd03ddc4aa365c5862af1c21_medium.jpg",
            "avatarfull": "http://cdn.akamai.steamstatic.com/steamcommunity/public/images/avatars/da/daece8a16d866ef9bd03ddc4aa365c5862af1c21_full.jpg",
            "personastate": 1,
            "realname": "Michal Šlesár",
            "primaryclanid": "103582791436765601",
            "timecreated": 1400861961,
            "personastateflags": 0,
            "loccountrycode": "SK",
            "locstatecode": "08"
        }
    ]

}

}

我想将人物命名为变量,但它什么也没做,变量为空 我认为 json_decode 不起作用,但我真的不知道。

    $pname = json_decode(file_get_contents("http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v002/?key=KEYCONSORED&Steamids={$_SESSION['T2SteamID64']}"));
    echo $pname['response']['players']['personaname'];

回声是空的

【问题讨论】:

  • var_dump($pname); 显示什么?
  • print_r($pname);做什么?
  • print_r(json_decode($pname, true));和 $pname['response']['players'][0]['personaname'];

标签: php json steam-web-api


【解决方案1】:

Players 是一个数组:

$pname['response']['players'][0]['personaname'];

【讨论】:

    【解决方案2】:

    这里有几个错误。

    让我一一解释在 PHP JSON 解码/编码中查找常见错误的提示。

    1。 JSON 无效

    首先,您的 JSON 无效,最后缺少结尾 }

    更新:就在@tftd 评论之后,我看到你的代码格式错误,但无论如何,让我解释一下如何找到问题,因为这在 PHP 中应该不是微不足道的。其他错误仍然有效。

    要检查json_decode为什么不起作用,请使用json_last_error:它会返回一个错误号,这意味着:

    0 = JSON_ERROR_NONE = "No error has occurred"
    1 = JSON_ERROR_DEPTH = "The maximum stack depth has been exceeded"
    2 = JSON_ERROR_STATE_MISMATCH  = "Invalid or malformed JSON"
    3 = JSON_ERROR_CTRL_CHAR = "Control character error, possibly incorrectly encoded"
    4 = JSON_ERROR_SYNTAX = "Syntax error"
    5 = JSON_ERROR_UTF8 = "Malformed UTF-8 characters, possibly incorrectly encode"
    6 = JSON_ERROR_RECURSION = "One or more recursive references in the value to be encoded"
    7 = JSON_ERROR_INF_OR_NAN = "One or more NAN or INF values in the value to be encoded"
    8 = JSON_ERROR_UNSUPPORTED_TYPE = "A value of a type that cannot be encoded was given"
    

    在您的情况下,它返回 4。所以,我去http://jsonlint.com 验证你的JSON,最后我发现了丢失的}

    2。 json_decode 返回对象,而不是数组

    如果您想访问一个 $pname 作为数组,您需要将您的 json_decode 行改为:

    $pname = json_decode(file_get_contents("http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v002/?key=KEYCONSORED&Steamids={$_SESSION['T2SteamID64']}"), true);
    

    注意最后一个参数,true 用于 json_decode 方法。根据documentation,当true时,返回的对象会被转换成关联数组。

    3。玩家是一个数组

    修复了您的 JSON 和 json_decode 调用,我们可以看到 players 是一个数组。因此,如果您想阅读第一个播放器,请使用:

    $pname['response']['players'][0]
    

    固定代码

    我不是从 URL 读取的,所以我使用了heredoc

    <?php
    
    $content = <<<EOD
    {
    "response": {
        "players": [
            {
                "steamid": "76561198137714668",
                "communityvisibilitystate": 3,
                "profilestate": 1,
                "personaname": "UareBugged",
                "lastlogoff": 1418911040,
                "commentpermission": 1,
                "profileurl": "http://steamcommunity.com/id/uarenotbest/",
                "avatar": "http://cdn.akamai.steamstatic.com/steamcommunity/public/images/avatars/da/daece8a16d866ef9bd03ddc4aa365c5862af1c21.jpg",
                "avatarmedium": "http://cdn.akamai.steamstatic.com/steamcommunity/public/images/avatars/da/daece8a16d866ef9bd03ddc4aa365c5862af1c21_medium.jpg",
                "avatarfull": "http://cdn.akamai.steamstatic.com/steamcommunity/public/images/avatars/da/daece8a16d866ef9bd03ddc4aa365c5862af1c21_full.jpg",
                "personastate": 1,
                "realname": "Michal Šlesár",
                "primaryclanid": "103582791436765601",
                "timecreated": 1400861961,
                "personastateflags": 0,
                "loccountrycode": "SK",
                "locstatecode": "08"
            }
        ]
    
     }
    }
    EOD;
    
    $pname = json_decode($content, true);
    echo $pname['response']['players'][0]['personaname'];
    

    这将按预期输出UareBugged

    【讨论】:

    • 请注意 - json 是有效的,只是用户没有正确格式化它。缺少的} 超出了格式范围。
    • @tftd,很公平(我给了你一个 +1)。但其他错误仍然有效。我会保留无效的 json 谈话,因为发现那种错误并不明显,应该是。
    • 是的,这通常很容易被忽略。 :)
    猜你喜欢
    • 1970-01-01
    • 2018-10-27
    • 1970-01-01
    • 2013-08-26
    • 1970-01-01
    • 2016-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多