Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to convert a string to JSON object in PHP

I have the following result from an SQL query:

{"Coords":[     {"Accuracy":"65","Latitude":"53.277720488429026","Longitude":"-9.012038778269686","Timestamp":"Fri Jul 05 2013 11:59:34 GMT+0100 (IST)"},     {"Accuracy":"65","Latitude":"53.277720488429026","Longitude":"-9.012038778269686","Timestamp":"Fri Jul 05 2013 11:59:34 GMT+0100 (IST)"},     {"Accuracy":"65","Latitude":"53.27770755361785","Longitude":"-9.011979642121824","Timestamp":"Fri Jul 05 2013 12:02:09 GMT+0100 (IST)"},     {"Accuracy":"65","Latitude":"53.27769091555766","Longitude":"-9.012051410095722","Timestamp":"Fri Jul 05 2013 12:02:17 GMT+0100 (IST)"},     {"Accuracy":"65","Latitude":"53.27769091555766","Longitude":"-9.012051410095722","Timestamp":"Fri Jul 05 2013 12:02:17 GMT+0100 (IST)"}      ] } 

It is currently a string in PHP. I know it's already in JSON form, is there an easy way to convert this to a JSON object?

I need it to be an object so I can add an extra item/element/object like what "Coords" already is.

like image 501
user2363025 Avatar asked Jul 05 '13 11:07

user2363025


2 Answers

What @deceze said is correct, it seems that your JSON is malformed, try this:

{     "Coords": [{         "Accuracy": "30",         "Latitude": "53.2778273",         "Longitude": "-9.0121648",         "Timestamp": "Fri Jun 28 2013 11:43:57 GMT+0100 (IST)"     }, {         "Accuracy": "30",         "Latitude": "53.2778273",         "Longitude": "-9.0121648",         "Timestamp": "Fri Jun 28 2013 11:43:57 GMT+0100 (IST)"     }, {         "Accuracy": "30",         "Latitude": "53.2778273",         "Longitude": "-9.0121648",         "Timestamp": "Fri Jun 28 2013 11:43:57 GMT+0100 (IST)"     }, {         "Accuracy": "30",         "Latitude": "53.2778339",         "Longitude": "-9.0121466",         "Timestamp": "Fri Jun 28 2013 11:45:54 GMT+0100 (IST)"     }, {         "Accuracy": "30",         "Latitude": "53.2778159",         "Longitude": "-9.0121201",         "Timestamp": "Fri Jun 28 2013 11:45:58 GMT+0100 (IST)"     }] } 

Use json_decode to convert String into Object (stdClass) or array: http://php.net/manual/en/function.json-decode.php

[edited]

I did not understand what do you mean by "an official JSON object", but suppose you want to add content to json via PHP and then converts it right back to JSON?

assuming you have the following variable:

$data = '{"Coords":[{"Accuracy":"65","Latitude":"53.277720488429026","Longitude":"-9.012038778269686","Timestamp":"Fri Jul 05 2013 11:59:34 GMT+0100 (IST)"},{"Accuracy":"65","Latitude":"53.277720488429026","Longitude":"-9.012038778269686","Timestamp":"Fri Jul 05 2013 11:59:34 GMT+0100 (IST)"},{"Accuracy":"65","Latitude":"53.27770755361785","Longitude":"-9.011979642121824","Timestamp":"Fri Jul 05 2013 12:02:09 GMT+0100 (IST)"},{"Accuracy":"65","Latitude":"53.27769091555766","Longitude":"-9.012051410095722","Timestamp":"Fri Jul 05 2013 12:02:17 GMT+0100 (IST)"},{"Accuracy":"65","Latitude":"53.27769091555766","Longitude":"-9.012051410095722","Timestamp":"Fri Jul 05 2013 12:02:17 GMT+0100 (IST)"}]}'; 

You should convert it to Object (stdClass):

$manage = json_decode($data);

But working with stdClass is more complicated than PHP-Array, then try this (use second param with true):

$manage = json_decode($data, true);

This way you can use array functions: http://php.net/manual/en/function.array.php

adding an item:

$manage = json_decode($data, true);  echo 'Before: <br>'; print_r($manage);  $manage['Coords'][] = Array(     'Accuracy' => '90'     'Latitude' => '53.277720488429026'     'Longitude' => '-9.012038778269686'     'Timestamp' => 'Fri Jul 05 2013 11:59:34 GMT+0100 (IST)' );  echo '<br>After: <br>'; print_r($manage); 

remove first item:

$manage = json_decode($data, true); echo 'Before: <br>'; print_r($manage); array_shift($manage['Coords']); echo '<br>After: <br>'; print_r($manage); 

any chance you want to save to json to a database or a file:

$data = '{"Coords":[{"Accuracy":"65","Latitude":"53.277720488429026","Longitude":"-9.012038778269686","Timestamp":"Fri Jul 05 2013 11:59:34 GMT+0100 (IST)"},{"Accuracy":"65","Latitude":"53.277720488429026","Longitude":"-9.012038778269686","Timestamp":"Fri Jul 05 2013 11:59:34 GMT+0100 (IST)"},{"Accuracy":"65","Latitude":"53.27770755361785","Longitude":"-9.011979642121824","Timestamp":"Fri Jul 05 2013 12:02:09 GMT+0100 (IST)"},{"Accuracy":"65","Latitude":"53.27769091555766","Longitude":"-9.012051410095722","Timestamp":"Fri Jul 05 2013 12:02:17 GMT+0100 (IST)"},{"Accuracy":"65","Latitude":"53.27769091555766","Longitude":"-9.012051410095722","Timestamp":"Fri Jul 05 2013 12:02:17 GMT+0100 (IST)"}]}';  $manage = json_decode($data, true);  $manage['Coords'][] = Array(     'Accuracy' => '90'     'Latitude' => '53.277720488429026'     'Longitude' => '-9.012038778269686'     'Timestamp' => 'Fri Jul 05 2013 11:59:34 GMT+0100 (IST)' );  if (($id = fopen('datafile.txt', 'wb'))) {     fwrite($id, json_encode($manage));     fclose($id); } 

I hope I have understood your question.

Good luck.

like image 125
Guilherme Nascimento Avatar answered Sep 29 '22 02:09

Guilherme Nascimento


To convert a valid JSON string back, you can use the json_decode() method.

To convert it back to an object use this method:

$jObj = json_decode($jsonString); 

And to convert it to a associative array, set the second parameter to true:

$jArr = json_decode($jsonString, true); 

By the way to convert your mentioned string back to either of those, you should have a valid JSON string. To achieve it, you should do the following:

  1. In the Coords array, remove the two " (double quote marks) from the start and end of the object.
  2. The objects in an array are comma seprated (,), so add commas between the objects in the Coords array..

And you will have a valid JSON String..

Here is your JSON String I converted to a valid one: http://pastebin.com/R16NVerw

like image 26
Miro Markaravanes Avatar answered Sep 29 '22 03:09

Miro Markaravanes