JSON output for mapping data using json_decode() in php - php

I am attempting to write PHP code to interact with JSON output from Mapquest's Open API / Open Street Map service. I have listed it below. I have been using this code in my Drupal 6 implementation. This code returns no output. When I use it, json_last_error() outputs 0.
function json_test_page() {
$url = 'http://open.mapquestapi.com/directions/v1/route?outFormat=json&from=40.037661,-76.305977&to=39.962532,-76.728099';
$json = file_get_contents($url);
$obj = json_decode(var_export($json));
$foo .= $obj->{'fuelUsed'};
$output .= foo;
return $output;
}
You can view the raw JSON output by following the URL. In this function I am expecting to get 1.257899 as my output. I have two questions:
(1) What can I call so I get items out of my array. For instance, how can I get the value represented in JSON "distance":26.923 out of the array?
(2) Is it possible am I running into a recursion limit issue that I've read about in the PHP Manual?

If you read the manual page for json_decode carefully, you'll notice there is a parameter (false by default) that you can pass to have it return an array rather than an object.
$obj = json_decode($json, true);
So:
<?php
function json_test_page() {
$url = 'http://open.mapquestapi.com/directions/v1/route?outFormat=json&from=40.037661,-76.305977&to=39.962532,-76.728099';
$json = file_get_contents($url);
$obj = json_decode($json, true);
//var_dump($obj);
echo $obj['route']['fuelUsed'];
}
json_test_page();

Remove the var_export function from json_decode.
You're trying to convert information about a string to json.
I was able to get the fuelUsed property this way
function json_test_page() {
$url = 'http://open.mapquestapi.com/directions/v1/route?outFormat=json&from=40.037661,-76.305977&to=39.962532,-76.728099';
$json = file_get_contents($url);
$obj = json_decode($json);
return $obj->route->fuelUsed;
}

Related

Adding object to array also adds 'null'

I send the following data to my php file via ajax:
JSON.stringify({test1: '1', test2: '2'})
I would like to write this data to my JSON FILE content.json containing an empty array
[]
I only want to add the content though if it is not there, yet. This is my PHP code:
$jsonStringObject = file_get_contents("php://input");
$phpObject = json_decode($jsonStringObject);
$newJsonStringObject = json_encode($phpObject);
header('Content-Type: application/json');
$jsonString = file_get_contents('content.json');
$data = (array) json_decode($jsonString, true);
if (in_array($phpObject, $data) === false){
$data[] = $phpObject;
}
$newJsonString = json_encode($data);
file_put_contents('content.json', $newJsonString);
It almost works. Something is wrong with the way the data is added to the array because when I call the function for the first time, it updates content.json to
[null,{"test1":"1","test2":"2"}]
On calling the function again, it adds the object again despite the if-statement:
[null,{"test1":"1","test2":"2"},{"test1":"1","test2":"2"},{"test1":"1","test2":"2"}]
Can anyone help me to spot the mistake?
You're comparing apples and oranges (or rather objects to arrays).
Make sure you decode all json as arrays:
$jsonStringObject = file_get_contents("php://input");
// Added true as second argument to get it bas as an array
$phpObject = json_decode($jsonStringObject, true);
$jsonString = file_get_contents('content.json');
// Removed the (array) since the second argument literally means "return as array"
$data = json_decode($jsonString, true);
if (in_array($phpObject, $data) === false){
$data[] = $phpObject;
}
$newJsonString = json_encode($data);
file_put_contents('content.json', $newJsonString);
Demo: https://3v4l.org/rnCn5

Turning a string into an associative array in PHP

I am using PHP with cURL to make requests to an API.
The API responds with an encrypted string which I then have to use json_decode on and run it through a pre-defined decrypt method that returns a string.
So I have something like this:
echo $response;
$decodedResponse = json_decode($response, true);
// New instance of Decrypt
$decrypt = new Decrypt();
$decryptedResponse = $decrypt->decrypt($decodedResponse);
echo $decryptedResponse;
Using var_dump($decryptedResponse) yields string(960) but the string looks like a JSON array.
{"Title":"Mr","Forenames":"Steve"}
So what is the best way to rip apart this string so that I can use the variables through an associative array?
I had already tried:
foreach(decryptedResponse as $data)
{
echo $data['Title'];
}
But this outputted nothing on the screen.
Am I misinterpreting the use of json_decode?
As many have stated it seems you have to decode twice, I'll look into this and share my findings.
You need to json_decode again on the decrypt result
$decodedResponse = json_decode($response, true);
// New instance of Decrypt
$decrypt = new Decrypt();
$decryptedResponse = $decrypt->decrypt($decodedResponse);
$decryptedArry = json_decode($decryptedResponse, true);
var_dump($decryptedArry);
echo $decryptedArry['Title'];
As you told Using `var_dump($decryptedResponse)` yields string(960) but the string looks like a JSON means your decrypt duration convert it again json. You can try bellow code it may resolve your issue
$decodedResponse = json_decode($response, true);
// New instance of Decrypt
$decrypt = new Decrypt();
$decryptedResponse = $decrypt->decrypt($decodedResponse);
$decryptedResponse = json_decode($response, true);
foreach(decryptedResponse as $data)
{
echo $data['Title'];
}
The code below shows that the json_decode works like you want it to but it seems like your Decryption class does something weird.
$response = '{"Title":"Mr","Forenames":"Steve"}';
$decodedResponse = json_decode($response, true);
var_dump($decodedResponse);
echo $decodedResponse["Title"];

Json api decoding

here is my json
{
"rgInventory": {
"5455029633": {
"id":"5455029633",
"classid":"310776543",
"instanceid":"302028390",
"amount":"1"
}
}
}
Here is my way to parse json in php
$content = file_get_contents("http://steamcommunity.com/profiles/76561198201055225/inventory/json/730/2");
$decode = json_decode($content);
foreach($decode->rgInventory->5455029633 as $appid){
echo $appid->id;
}
I need to get that 5455029633 but it dont work in foreach.
And I want to store it in the variable too.
Json, which you've provided is invalid. Remove last comma from "amount":"1", and you are missing closing curly bracket. Then you should be able to access desired value as $decode->rgInventory->{"5455029633"}.
Or make your life simpler ;) and just go for assoc array $decode = json_decode($content, true);
You will need to pass true as second argument to the function json_decode to get an array instead of an object :
PHP
<?php
$content = file_get_contents("http://steamcommunity.com/profiles/76561198201055225/inventory/json/730/2");
$decode = json_decode($content, true);
echo $decode['rgInventory']['6255037137']['id']; // will output the property 'id' of the inventory 6255037137
$invetory = $decode['rgInventory']['6255037137'] // will store the inventory 6255037137 in the variable $inventory
?>

Decode JSON to PHP

I have a .txt file called 'test.txt' that is a JSON array like this:
[{"email":"chrono#gmail.com","createdate":"2016-03-23","source":"email"}]
I'm trying to use PHP to decode this JSON array so I can send my information over to my e-mail database for capture. I've created a PHP file with this code:
<?php
$url = 'http://www.test.com/sweeps/test.txt';
$content = file_get_contents($url);
$json = json_decode($content,true);
echo $json;
?>
For some reason, it's not echoing the decoded JSON when I visit my php page. Is there a reason for this and can anyone shed some light? Thanks!
You use echo to print scalar variables like
$x = 'Fred';
echo $x;
To print an array or object you use print_r() or var_dump()
$array = [1,2,3,4];
print_r($array);
As json_decode() takes a JSON string and converts it to a PHP array or object use print_r() for example.
Also if the json_decode() fails for any reason there is a function provided to print the error message.
<?php
$url = 'http://www.test.com/sweeps/test.txt';
$content = file_get_contents($url);
$json = json_decode($content,true);
if ( json_last_error() !== JSON_ERROR_NONE ) {
echo json_last_error_msg();
exit;
}
You'll need to split that json string into two separate json strings (judging by the pastebin you've provided). Look for "][", break there, and try with any of the parts you end up with:
$tmp = explode('][', $json_string);
if (!count($tmp)) {
$json = json_decode($json_string);
var_dump($json);
} else {
foreach ($tmp as $json_part) {
$json = json_decode('['.rtrim(ltrim($json_string, '['), ']').']');
var_dump($json);
}
}

json_decode in php is returning null

I'm trying to encode a json string but it keeps returning null. I've tried a few suggestion here on st
$url = "https://www.google.com/finance?output=json&start=0&num=200&noIL=1&q=[currency%20%3D%3D%20%22USD%22%20%26%20%28%28exchange%20%3D%3D%20%22NYSEMKT%22%29%20%7C%20%28exchange%20%3D%3D%20%22NYSEARCA%22%29%20%7C%20%28exchange%20%3D%3D%20%22NYSE%22%29%20%7C%20%28exchange%20%3D%3D%20%22NASDAQ%22%29%29%20%26%20%28change_today_percent%20%3E%3D%20-101%29%20%26%20%28change_today_percent%20%3C%3D%20-3%29%20%26%20%28volume%20%3E%3D%20150001%29%20%26%20%28volume%20%3C%3D%20313940000%29%20%26%20%28last_price%20%3E%3D%2010%29%20%26%20%28last_price%20%3C%3D%20229301%29]&restype=company&ei=T5mTVKG5IYT1igKEoYHQCQ";
$obj = file_get_contents($url);
$obj = json_decode($obj);
var_dump($obj);
JSON doesn't support \x escapes, so it's invalid JSON by definition, hence why json_decode() returns null. Decoding the valid JSON \u0022 works fine.
$url = "https://www.google.com/finance?output=json&start=0&num=200&noIL=1&q=[currency%20%3D%3D%20%22USD%22%20%26%20%28%28exchange%20%3D%3D%20%22NYSEMKT%22%29%20%7C%20%28exchange%20%3D%3D%20%22NYSEARCA%22%29%20%7C%20%28exchange%20%3D%3D%20%22NYSE%22%29%20%7C%20%28exchange%20%3D%3D%20%22NASDAQ%22%29%29%20%26%20%28change_today_percent%20%3E%3D%20-101%29%20%26%20%28change_today_percent%20%3C%3D%20-3%29%20%26%20%28volume%20%3E%3D%20150001%29%20%26%20%28volume%20%3C%3D%20313940000%29%20%26%20%28last_price%20%3E%3D%2010%29%20%26%20%28last_price%20%3C%3D%20229301%29]&restype=company&ei=T5mTVKG5IYT1igKEoYHQCQ";
$obj = file_get_contents($url);
$obj = trim($obj);
$obj = str_replace('\x', '\u00', $obj);
$obj = json_decode($obj,true);
var_dump($obj);
Try this code
<?php
function convert($string) {
return preg_replace_callback('#\\\\x([[:xdigit:]]{2})#ism', function($matches) {
return htmlentities(chr(hexdec($matches[1])));
}, $string);
}
$url = "https://www.google.com/finance?output=json&start=0&num=200&noIL=1&q=[currency%20%3D%3D%20%22USD%22%20%26%20%28%28exchange%20%3D%3D%20%22NYSEMKT%22%29%20%7C%20%28exchange%20%3D%3D%20%22NYSEARCA%22%29%20%7C%20%28exchange%20%3D%3D%20%22NYSE%22%29%20%7C%20%28exchange%20%3D%3D%20%22NASDAQ%22%29%29%20%26%20%28change_today_percent%20%3E%3D%20-101%29%20%26%20%28change_today_percent%20%3C%3D%20-3%29%20%26%20%28volume%20%3E%3D%20150001%29%20%26%20%28volume%20%3C%3D%20313940000%29%20%26%20%28last_price%20%3E%3D%2010%29%20%26%20%28last_price%20%3C%3D%20229301%29]&restype=company&ei=T5mTVKG5IYT1igKEoYHQCQ";
$obj = file_get_contents($url);
$obj = convert($obj);
$obj = json_decode($obj);
echo '<pre>'; print_r($obj); echo '</pre>';
?>
As recommended here (and pointed out by #showdev already, thanks!) you should use their RSS API and parse that as XML instead, because Google does not deem it necessary to honour web standards (here, they fail at JSON; elsewhere, they fail at simple things like SMTP and especially IMAP).
JSON has a very detailed specification, and it is very easy to adhere to in generators. Making JSON parsing strict is recommended for security reasons – especially with external input. So please use Google’s RSS variant.

Categories