How do I extract data from JSON with PHP?

The name of the pictureThe name of the pictureThe name of the pictureClash Royale CLAN TAG#URR8PPP


How do I extract data from JSON with PHP?



This is intended to be a general reference question and answer covering many of the never-ending "How do I access data in my JSON?" questions. It is here to handle the broad basics of decoding JSON in PHP and accessing the results.



I have the JSON:


{
"type": "donut",
"name": "Cake",
"toppings": [
{ "id": "5002", "type": "Glazed" },
{ "id": "5006", "type": "Chocolate with Sprinkles" },
{ "id": "5004", "type": "Maple" }
]
}



How do I decode this in PHP and access the resulting data?





Related: Able to see a variable in print_r()'s output, but not sure how to access it in code, interactive JSON exploration in context of PHP is possible here: array.include-once.org
– hakre
Mar 27 '15 at 21:09





Please can I know that why this question not consider as a duplicate question even 9 or less users marked as a duplicate for stackoverflow.com/questions/4343596/parsing-json-file-with-php? M
– I am the Most Stupid Person
Aug 9 '17 at 5:46







@IamtheMostStupidPerson I'll try to explain, even though your username makes me doubt you'll get it ;). This question is asked, and its answers are written, in a "canonical" way. As such, it's a better recipient for duplicate target than the other questions.
– Félix Gagnon-Grenier
Feb 25 at 20:13




2 Answers
2



First off you have a string. JSON is not an array, an object, or a data structure. JSON is a text-based serialization format - so a fancy string, but still just a string. Decode it in PHP by using json_decode().


json_decode()


$data = json_decode($json);



Therein you might find:



These are the things that can be encoded in JSON. Or more accurately, these are PHP's versions of the things that can be encoded in JSON.



There's nothing special about them. They are not "JSON objects" or "JSON arrays." You've decoded the JSON - you now have basic everyday PHP types.



Objects will be instances of stdClass, a built-in class which is just a generic thing that's not important here.



You access the properties of one of these objects the same way you would for the public non-static properties of any other object, e.g. $object->property.


$object->property


$json = '
{
"type": "donut",
"name": "Cake"
}';

$yummy = json_decode($json);

echo $yummy->type; //donut



You access the elements of one of these arrays the same way you would for any other array, e.g. $array[0].


$array[0]


$json = '
[
"Glazed",
"Chocolate with Sprinkles",
"Maple"
]';

$toppings = json_decode($json);

echo $toppings[1]; //Chocolate with Sprinkles



Iterate over it with foreach.


foreach


foreach ($toppings as $topping) {
echo $topping, "n";
}



Glazed
Chocolate with Sprinkles
Maple



Or mess about with any of the bazillion built-in array functions.



The properties of objects and the elements of arrays might be more objects and/or arrays - you can simply continue to access their properties and members as usual, e.g. $object->array[0]->etc.


$object->array[0]->etc


$json = '
{
"type": "donut",
"name": "Cake",
"toppings": [
{ "id": "5002", "type": "Glazed" },
{ "id": "5006", "type": "Chocolate with Sprinkles" },
{ "id": "5004", "type": "Maple" }
]
}';

$yummy = json_decode($json);

echo $yummy->toppings[2]->id; //5004


true



When you do this, instead of objects you'll get associative arrays - arrays with strings for keys. Again you access the elements thereof as usual, e.g. $array['key'].


$array['key']


$json = '
{
"type": "donut",
"name": "Cake",
"toppings": [
{ "id": "5002", "type": "Glazed" },
{ "id": "5006", "type": "Chocolate with Sprinkles" },
{ "id": "5004", "type": "Maple" }
]
}';

$yummy = json_decode($json, true);

echo $yummy['toppings'][2]['type']; //Maple



Read the documentation for whatever it is you're getting the JSON from.



Look at the JSON - where you see curly brackets {} expect an object, where you see square brackets expect an array.


{}




Hit the decoded data with a print_r():


print_r()


$json = '
{
"type": "donut",
"name": "Cake",
"toppings": [
{ "id": "5002", "type": "Glazed" },
{ "id": "5006", "type": "Chocolate with Sprinkles" },
{ "id": "5004", "type": "Maple" }
]
}';

$yummy = json_decode($json);

print_r($yummy);



and check the output:


stdClass Object
(
[type] => donut
[name] => Cake
[toppings] => Array
(
[0] => stdClass Object
(
[id] => 5002
[type] => Glazed
)

[1] => stdClass Object
(
[id] => 5006
[type] => Chocolate with Sprinkles
)

[2] => stdClass Object
(
[id] => 5004
[type] => Maple
)

)

)



It'll tell you where you have objects, where you have arrays, along with the names and values of their members.



If you can only get so far into it before you get lost - go that far and hit that with print_r():


print_r()


print_r($yummy->toppings[0]);


stdClass Object
(
[id] => 5002
[type] => Glazed
)



Break the problem down into pieces that are easier to wrap your head around.


json_decode()


null



This happens because either:


null


json_last_error_msg


json_decode()



If you need to change the max depth you're probably solving the wrong problem. Find out why you're getting such deeply nested data (e.g. the service you're querying that's generating the JSON has a bug) and get that to not happen.



Sometimes you'll have an object property name that contains something like a hyphen - or at sign @ which can't be used in a literal identifier. Instead you can use a string literal within curly braces to address it.


-


@


$json = '{"@attributes":{"answer":42}}';
$thing = json_decode($json);

echo $thing->{'@attributes'}->answer; //42



If you have an integer as property see: How to access object properties with names like integers? as reference.



It's ridiculous but it happens - there's JSON encoded as a string within your JSON. Decode, access the string as usual, decode that, and eventually get to what you need.


$json = '
{
"type": "donut",
"name": "Cake",
"toppings": "[{ "type": "Glazed" }, { "type": "Maple" }]"
}';

$yummy = json_decode($json);
$toppings = json_decode($yummy->toppings);

echo $toppings[0]->type; //Glazed



If your JSON is too large for json_decode() to handle at once things start to get tricky. See:


json_decode()



See: Reference: all basic ways to sort arrays and data in PHP.





just stumbled at this answer and found that the link to array.include-once.org is broken.
– Jeff
Sep 22 '17 at 22:47





@Jeff Thanks. Shame about that. I've removed the link.
– Paul Crovella
Sep 22 '17 at 23:00





yeah, considering the name of the link and how you've described it, it sounds like a real bummer.
– Jeff
Sep 22 '17 at 23:04





Very good explanation. Taught me may things
– GeekWithGlasses
Sep 29 '17 at 13:43





only thing this solution lacks was how to extract data from another json file. I would recommend, this solutuon:stackoverflow.com/questions/19758954/…
– Ishan Srivastava
Oct 23 '17 at 21:58



You can use json_decode() to convert a json string to a PHP object/array.



Eg.



Input:


$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';

var_dump(json_decode($json));
var_dump(json_decode($json, true));



Output:


object(stdClass)#1 (5) {
["a"] => int(1)
["b"] => int(2)
["c"] => int(3)
["d"] => int(4)
["e"] => int(5)
}

array(5) {
["a"] => int(1)
["b"] => int(2)
["c"] => int(3)
["d"] => int(4)
["e"] => int(5)
}



Few Points to remember:


json_decode


json


NULL


json_last_error()


utf8


json_decode


NULL





Why there are downvotes to this answer?!
– candlejack
Dec 28 '16 at 21:39





well, they might not have liked its simplicity, nonetheless. You can always upvote ;)
– 9KSoft
Dec 29 '16 at 3:33





Probably the more likely reason is that it has already been answered and it looks like @MohdAbdulMujib is after some free rep
– Isaac
Jan 11 '17 at 21:18





@Isaac some people may not be very keen in reading the whole manual when they just want to begin with using the function. Otherwise they'd be better off reading the official doc. The whole point of SO is the simplicity in which the answers are provided. IMHO
– 9KSoft
Jan 12 '17 at 2:28






By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Popular posts from this blog

How to scale/resize CVPixelBufferRef in objective C, iOS

Stripe::AuthenticationError No API key provided. Set your API key using “Stripe.api_key = ”

SVG with two text elements. When one resizes due to textLength - how to resize the other one to the same character size