Search code examples
phpjsonamazon-ecs

How can I save an Amazon API JSON response to a JSON file?


I'm trying to save an Amazon API response object into a file called items.json The response itself is in json but when I use this function the file that I get is empty. Don't mind the unlink() function this is a cron job.

<?php
/**
 * Amazon ECS library
 */

if ("cli" !== PHP_SAPI)
{
    echo "<pre>";
}

if (is_file('sampleSettings.php'))
{
  include 'sampleSettings.php';
}

defined('AWS_API_KEY') or define('AWS_API_KEY', 'API KEY');
defined('AWS_API_SECRET_KEY') or define('AWS_API_SECRET_KEY', 'SECRET KEY');
defined('AWS_ASSOCIATE_TAG') or define('AWS_ASSOCIATE_TAG', 'ASSOCIATE TAG');

require '../lib/AmazonECS.class.php';

try
{

    $amazonEcs = new AmazonECS('AWS_API_KEY', 'AWS_API_SECRET_KEY', 'com', 'AWS_ASSOCIATE_TAG');

   $amazonEcs->associateTag(AWS_ASSOCIATE_TAG);

   $response = $amazonEcs->category('KindleStore')->responseGroup('Small,Images')->search('free ebooks');

    //Check if the json file exist
   $filename = "/home/myusername/public_html/my/path_to/items.json";
   if(file_exists($filename)){
    //delete it
    unlink($filename);
    file_put_contents("items.json", $response);
   }else{
    file_put_contents("items.json", $response);
   }    
}
catch(Exception $e)
{
  echo $e->getMessage();
}


if ("cli" !== PHP_SAPI)
{
    echo "</pre>";
}

Any suggestions on how to fix this?

EDIT: The $response variable is not empty; here's what I get when I var_dump it:

  ["Item"]=>
    array(10) {
      [0]=>
      object(stdClass)#15 (8) {
        ["ASIN"]=>
        string(10) "B004YDSL9Q"
        ["DetailPageURL"]=>
        string(208) "http://www.amazon.com/The-Love-suspense-mystery-ebook/dp/B004YDSL9Q%3F"
        ["ItemLinks"]=>
        object(stdClass)#16 (1) {
          ["ItemLink"]=>
          array(7) {
            [0]=>
            object(stdClass)#17 (2) {
              ["Description"]=>
              string(17) "Technical Details"
              ["URL"]=>
              string(218) "http://www.amazon.com/The-Love-suspense-mystery-ebook/dp/tech-data/B004YDSL9Q%3F"
            }
            [1]=>
            object(stdClass)#18 (2) {
              ["Description"]=>
              string(20) "Add To Baby Registry"
              ["URL"]=>
              string(215) "http://www.amazon.com/gp/registry/baby/add-item.html"
            }
            [2]=>
            object(stdClass)#19 (2) {
              ["Description"]=>
              string(23) "Add To Wedding Registry"
              ["URL"]=>
              string(218) "http://www.amazon.com/gp/registry/wedding/add-item.html%3Fasin.0%3DB004YDSL9Q%26"
            }
            [3]=>
            object(stdClass)#20 (2) {
              ["Description"]=>
              string(15) "Add To Wishlist"
              ["URL"]=>
              string(219) "http://www.amazon.com/gp/registry/wishlist/add-item.html%3Fasin.0%3DB004YDSL9Q%26"
            }
            [4]=>
            object(stdClass)#21 (2) {
              ["Description"]=>
              string(13) "Tell A Friend"
              ["URL"]=>
              string(184) "http://www.amazon.com/gp/pdp/taf/B004YDSL9Q%3F"
            }
            [5]=>
            object(stdClass)#22 (2) {
              ["Description"]=>
              string(20) "All Customer Reviews"
              ["URL"]=>
              string(188) "http://www.amazon.com/review/product/B004YDSL9Q%3FSubscriptionId%3"
            }
            [6]=>
            object(stdClass)#23 (2) {
              ["Description"]=>
              string(10) "All Offers"
              ["URL"]=>
              string(190) "http://www.amazon.com/gp/offer-listing/B004YDSL9Q%3"
            }
          }
        }

And other items as well.

I was wrong: the API response isn't JSON, it is an Object and you have to encode it in json.

That's how I actually solved:

-cut-

   $response = $amazonEcs->category('KindleStore')->responseGroup('Small,Images')->search('free ebooks');
//json_encode on $response because the response of the API is not JSON, but it is an object

$data = json_encode($response);

//Using stripslashes function to delete all the slashed that has been added to $data by the encoding process

$data2 = stripslashes($data);

file_put_contents("items.json", $data2);

Solution

  • If the file that you create is empty, then the $response var is empty. Do some debugging. var_dump the response and see what you get. If the file is showing up where it should, but is empty, then it's down to what you're attempting to store in it, which in this is, case $response.

    So do this:

    var_dump( $response );
    

    Then come back here and tell us what you see.

    PS: I would post this as a comment (as I know it's not much of an answer), but I don't have the rep.