Steam Web API - парсинг JSON-результата GetUserStatsForGame - PullRequest
0 голосов
/ 20 мая 2018

Я пытаюсь проанализировать входящий JSON из Steam Web API для отображения конкретной статистики из игры.В этом случае игра Rust.

JSON возвращается из API:

{
"playerstats": {
    "steamID":"76561198288875739",
    "gameName":"",
    "stats":[
        {"name":"deaths","value":268},
        {"name":"bullet_fired","value":11370},
        {"name":"arrow_fired","value":856},
        {"name":"item_drop","value":3850},
        {"name":"blueprint_studied","value":293},
        {"name":"death_suicide","value":103},
        {"name":"death_fall","value":1},
        {"name":"death_selfinflicted","value":8},
        {"name":"kill_player","value":296},
        {"name":"bullet_hit_player","value":1171},
        {"name":"arrow_hit_entity","value":33},
        {"name":"harvest.stones","value":106299},
        {"name":"bullet_hit_entity","value":2484},
        {"name":"harvest.cloth","value":4426},
        {"name":"harvest.wood","value":379165},
        {"name":"arrow_hit_building","value":90},
        {"name":"kill_bear","value":34},
        {"name":"kill_boar","value":46},
        {"name":"kill_stag","value":31},
        {"name":"kill_chicken","value":8},
        {"name":"kill_horse","value":37},
        {"name":"kill_wolf","value":26},
        {"name":"headshot","value":364},
        {"name":"arrow_hit_boar","value":15},
        {"name":"arrow_hit_bear","value":68},
        {"name":"arrow_hit_wolf","value":18},
        {"name":"arrow_hit_stag","value":4},
        {"name":"arrow_hit_chicken","value":1},
        {"name":"bullet_hit_building","value":2455},
        {"name":"arrow_hit_horse","value":25},
        {"name":"arrow_hit_player","value":156},
        {"name":"death_entity","value":18},
        {"name":"death_wolf","value":1},
        {"name":"death_bear","value":7},
        {"name":"shotgun_fired","value":533},
        {"name":"shotgun_hit_building","value":30},
        {"name":"shotgun_hit_player","value":61},
        {"name":"shotgun_hit_horse","value":12},
        {"name":"bullet_hit_bear","value":168},
        {"name":"shotgun_hit_entity","value":95},
        {"name":"bullet_hit_horse","value":70},
        {"name":"bullet_hit_stag","value":20},
        {"name":"bullet_hit_wolf","value":31},
        {"name":"bullet_hit_boar","value":14},
        {"name":"bullet_hit_sign","value":9},
        {"name":"wounded","value":137},
        {"name":"wounded_assisted","value":53},
        {"name":"wounded_healed","value":27},
        {"name":"bullet_hit_playercorpse","value":96},
        {"name":"bullet_hit_corpse","value":87},
        {"name":"INVENTORY_OPENED","value":5292},
        {"name":"CRAFTING_OPENED","value":72},
        {"name":"MAP_OPENED","value":483},
        {"name":"CUPBOARD_OPENED","value":78},
        {"name":"ITEM_EXAMINED","value":6},
        {"name":"comfort_duration","value":7701.56640625},
        {"name":"calories_consumed","value":15861.1572265625},
        {"name":"water_consumed","value":4199.1533203125},
        {"name":"radiation_exposure_duration","value":799.53271484375},
        {"name":"cold_exposure_duration","value":8946.0244140625},
        {"name":"hot_exposure_duration","value":2202.734619140625},
        {"name":"melee_strikes","value":1940},
        {"name":"melee_thrown","value":47},
        {"name":"placed_blocks","value":164},
        {"name":"upgraded_blocks","value":1050},
        {"name":"arrows_shot","value":250},
        {"name":"seconds_speaking","value":79.7517318725585938},
        {"name":"acquired_lowgradefuel","value":748},
        {"name":"acquired_metal.ore","value":24883},
        {"name":"acquired_scrap","value":494},
        {"name":"topology_road_duration","value":785},
        {"name":"destroyed_barrels","value":113}
        ],
    "achievements":[
        {"name":"CONSTRUCT_BASE","achieved":1},
        {"name":"UPGRADE_BASE","achieved":1},
        {"name":"COLLECT_50_LGF","achieved":1},
        {"name":"COLLECT_300_METAL_ORE","achieved":1},
        {"name":"VISIT_ROAD","achieved":1},
        {"name":"COLLECT_65_SCRAP","achieved":1},
        {"name":"DESTROY_10_BARRELS","achieved":1}
        ]
    }
}

У меня возникли проблемы с использованием этих данных для отображения желаемой статистики.Например, я хочу отобразить общее количество убийств игроков ("name":"kill_player","value":296)

Как мне это удастся?Я уже анализировал несколько простых JSON, но ничего сложного.

Благодарю за помощь!


РЕДАКТИРОВАТЬ

Мне удалось получить все имена со всеми значениями, выполнив это:

$rust_info_result = json_decode($rust_info_result);
$rust_info_result = $rust_info_result->playerstats->stats;

foreach($rust_info_result as $r2)
{
  echo $r2->name; echo " "; echo $r2->value; echo "<br>";
}

Но я все еще не могу найти способ получить детали для конкретной статистики.Например, kill_player.


EDIT # 2

Мне удалось заставить это работать.Для тех, у кого такая же проблема, как у меня, я обнаружил, что следующий метод отлично работает для меня:

$rust_info_result = json_decode($rust_info_result);
$rust_info_result = $rust_info_result->playerstats->stats;

$stats = [];

foreach ($rust_info_result as $r2)
{
    $stats[$r2->name] = $r2->value;
}

echo "Player Kills: " . $stats['kill_player'];

1 Ответ

0 голосов
/ 20 мая 2018

Вам нужно перебрать массив элементов, чтобы найти тот, который имеет name, который вы ищете.К сожалению, нет встроенного, чтобы сделать это для вас.

<?php

$json = '{
    "playerstats": {
        "steamID":"76561198288875739",
        "gameName":"",
        "stats":[
            {"name":"melee_strikes","value":1940},
            {"name":"melee_thrown","value":47},
            {"name":"placed_blocks","value":164},
            {"name":"upgraded_blocks","value":1050},
        ],
        "achievements":[
            {"name":"CONSTRUCT_BASE","achieved":1},
            {"name":"UPGRADE_BASE","achieved":1},
        ]
    }
}';

function getStat(string $name, array $from): float
{
    foreach ($from['playerstats']['stats'] as $item) {
        if (isset($item['name']) && isset($item['value']) && $item['name'] === $name) {
            return $item['value'];
        }
    }
    return -1;
}

function getAchievement(string $name, array $from): float
{
    foreach ($from['playerstats']['achievements'] as $item) {
        if (isset($item['name']) && isset($item['achieved']) && $item['name'] === $name) {
            return $item['achieved'];
        }
    }
    return -1;
}

$dec = json_decode($json, true);

echo 'upgraded_blocks: ' . getStat('upgraded_blocks', $dec) . PHP_EOL;
echo 'CONSTRUCT_BASE: ' . getAchievement('CONSTRUCT_BASE', $dec) . PHP_EOL;

Я написал несколько очень простых вспомогательных функций, которые сделают эту работу за вас.Они вернут -1, если вы введете несуществующую статистику или имя достижения (или если оно не написано с учетом строчных и прописных букв).

...