peter flanagan
peter flanagan

Reputation: 9790

append data to json file php

I am using this php library to communicate with the spotify api to get my user details. The spotify api returns user data which I then want to add to a json file. Basically, whatever is sent back from the api I want to append to the json file for each user.

The data returned from the api looks like the following when I do print_r($api->me()); This is basically coming from this api call.

stdClass Object ( [display_name] => Paul Flanagan 
[email] => [email protected] 
[external_urls] => stdClass Object ( 
[spotify] => https://open.spotify.com/user/21aydctlhgjst3z7saj2rb4pq ) [followers] => stdClass Object ( 
[href] => [total] => 19 ) 
[href] => https://api.spotify.com/v1/users/2391231jasdasd1 
[id] => 21aydctlhgjst3z7saj2rb4pq 
[images] => Array ( [0] => stdClass Object ( 
[height] => [url] => https://scontent.xx.fbcdn.net/v/t1.0-1/p200x200/18301863_452622995075637_5517698155320169855_n.jpg?oh=9e949fafd3ee84705ea5c1fa1aa9c811&oe=59C9F63C 
[width] => ) ) [type] => user [uri] => spotify:user:21aydctlhgjst3z7saj2rb4pq )

I want to write this code to a json file

I have attempted many approaches but as I am more javascript focused than php I am struggling to write the data correctly. My latest attempt at the code looks like this:

<?php

    require 'vendor/autoload.php';

    $session = new SpotifyWebAPI\Session(
        'KEY1',
        'KEY2',
        'CALLBACK_URL'
    );

    $api = new SpotifyWebAPI\SpotifyWebAPI();

    if (isset($_GET['code'])) {
        $session->requestAccessToken($_GET['code']);
        $api->setAccessToken($session->getAccessToken());

        $file = "users.json";
        $json = json_decode(file_get_contents($file), true);
        $file = fopen($file,'w+');
        fwrite($file, $api->me());
        fclose($file);

        print_r($api->me());
    } else {
    $options = [
        'scope' => [
            'user-read-email',
        ],
    ];

    header('Location: ' . $session->getAuthorizeUrl($options)$
    die();

    }
?>

Upvotes: 0

Views: 1010

Answers (1)

u_mulder
u_mulder

Reputation: 54831

As $api->me() returns object - you cannot write it to a file directly. You should convert object to a string. Simple way is to json_encode it:

$file = "users.json";
$json = json_decode(file_get_contents($file), true);
$file = fopen($file,'w+');
fwrite($file, json_encode($api->me()));
fclose($file);

Next problem - is overwriting data. As you open file with w+ - you file gets truncated to 0 length.

Solution here depends on what you need with previous data. If you want to rewrite some data - I think current behaviour does it already.

If you want to append data to a file - you should use another mode when you open file, for example a+. But in this case, file contents won't be correct json, as you write to file not a single json string, but several strings, which is not correct json. So, it's up to you to find a proper solution.

Update:

According to file name, I suppose you store users in it. So, I think there's a list of users, encoded in json. So, a brief solution can be:

$file = "users.json";
$json = json_decode(file_get_contents($file), true);

// Now $json stores list of you current users. I suppose it's a simple array of arrays

// This is data for a new user
$new_user = $api->me();

// as data `$new_user` is object, I think you need to convert it to array
// this can be done as:
$new_user = json_decode(json_encode($new_user), true);

// now, add new user to existsing array
$json[] = $new_user; 

$file = fopen($file,'w+');

// now we can encode `$json` back and write it to a file
fwrite($file, json_encode($json));
fclose($file);

Upvotes: 1

Related Questions