Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Correctly format JSON file

Tags:

json

arrays

php

I'm trying to create a JSON file which contains objects and an array. Yet I'm missing the [ ]-brackets. I don't really know the exact terms for these JSON parts, which makes finding a solution using Google incredibly hard. I'm also a fairly new PHP coder, so I'm still learning. Any help or tips are really appreciated!

Code to create the JSON file:

$db_export = [
    'account' => [
          'username' => $username,
          'email' => $email
    ]
];


file_put_contents("output.json", json_encode($db_export, JSON_PRETTY_PRINT));

Which outputs as:

{
  "account": {
     "username": "test",
     "email": "[email protected]"
  }
}

What it's supposed to be:

{
  "account": [
    {
      "username": "test",
      "email": "[email protected]"
    }
  ]
}
like image 303
Mik Roe Avatar asked Aug 10 '26 20:08

Mik Roe


2 Answers

Adding [] characters will help. This creates an array inside the array.

$db_export = [
    'account' => [[ // <--- Added
      'username' => $username,
      'email' => $email
    ]] // <--- Added
];


file_put_contents("output.json", json_encode($db_export, JSON_PRETTY_PRINT));

This is how you get the result you want.

Output :

{ "account": [ { "username": null, "email": null } ] }

I guess it was a little simple :)

like image 86
Smokie Avatar answered Aug 13 '26 11:08

Smokie


I am adding this to explain what is going on with the original answer. You can find this same information in the json_encode php manual page, in the example sections.

With any simple PHP array, json_encode will transform the PHP array into a JSON array:

$simple = array('apple', 'banana', 'coconut');
echo json_encode($simple);

Returns:

["apple","banana","coconut"]

Any associative array will be turned into a json object {} and each associative key will become a property name.

$associative = array('breakfast' => 'apple', 'lunch' => 'banana', 'dinner' => 'coconut');
echo json_encode($associative);

Returns:

{"breakfast":"apple","lunch":"banana","dinner":"coconut"}

In your example, you have an array with an associative key 'account' that contains an array with 2 child elements, each with an associative key. This is the reason json_encode() is turning your structure into json objects.

In @Smokie's answer, the addition of an extra parent array that is "simple" ie. not keyed with a name, causes json_encode (following it's simple transformation rules) to create a javascript array, which it then sticks the javascript object inside of.

$username = 'test user';
$email = '[email protected]';


$db_export = [
    'account' => [[ // <--- Added
      'username' => $username,
      'email' => $email
    ]] // <--- Added
];
var_dump($db_export);

Returns:

array(1) {
  ["account"]=>
  array(1) {
    [0]=>
    array(2) {
      ["username"]=>
      string(9) "test user"
      ["email"]=>
      string(11) "[email protected]"
    }
  }
}

Here I use var_dump as a quick debugging tool to show what the PHP array looks like. The important thing to note is that 'account' is now an array(1) with one element ( the 0th element) that contains your original child array.

Presumably you need this because the assumption is that an account could have multiple accountname/email address pairs. If that isn't the case, I would question why you need to force a useless array. I personally don't see how an 'account' could have multiple username/email pairs associated with it.

With that said, this code should further illustrate how this all works, and why:

$username = 'test user';
$email = '[email protected]';

$db_export = [
    'account' => [[ // <--- Added
      'username' => $username,
      'email' => $email
    ]] // <--- Added
];

//Add another username/email pair to account
$db_export['account'][] = ['username' => 'test2 user', 'email' => '[email protected]'];

echo json_encode($db_export, JSON_PRETTY_PRINT);

Returns:

{
    "account": [
        {
            "username": "test user",
            "email": "[email protected]"
        },
        {
            "username": "test2 user",
            "email": "[email protected]"
        }
    ]
}
like image 26
gview Avatar answered Aug 13 '26 10:08

gview



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!