Créez un objet JSON de la bonne manière

107

J'essaye de créer un objet JSON à partir d'un tableau PHP. Le tableau ressemble à ceci:

$post_data = array('item_type_id' => $item_type,
    'string_key' => $string_key,
    'string_value' => $string_value,
    'string_extra' => $string_extra,
    'is_public' => $public,
    'is_public_for_contacts' => $public_contacts);

Le code pour encoder le JSON ressemble à ceci:

$post_data = json_encode($post_data);

Le fichier JSON est censé ressembler à ceci à la fin:

{
    "item": {
        "is_public_for_contacts": false,
        "string_extra": "100000583627394",
        "string_value": "value",
        "string_key": "key",
        "is_public": true,
        "item_type_id": 4,
        "numeric_extra": 0
    }
} 

Comment puis-je encapsuler le code JSON créé dans "l'élément": {JSON CODE HERE}.

Mark Denn
la source

Réponses:

161

Habituellement, vous feriez quelque chose comme ceci:

$post_data = json_encode(array('item' => $post_data));

Mais, comme il semble que vous voulez que la sortie soit avec " {}", vous feriez mieux de forcer l' json_encode()encodage en tant qu'objet, en passant la JSON_FORCE_OBJECTconstante.

$post_data = json_encode(array('item' => $post_data), JSON_FORCE_OBJECT);

Les {}crochets " " spécifient un objet et " []" sont utilisés pour les tableaux selon la spécification JSON.

Cristian
la source
Je voudrais ajouter le JSON_FORCE_OBJECTdansjson_encode($arr, JSON_FORCE_OBJECT)
Adam Lukaszczyk
Est-ce correct? $ post_data = json_encode (array ('item' => $ post_data), JSON_FORCE_OBJECT);
Mark Denn
1
peut-être que cela sera utile pour quelqu'un - jsonwrapper boutell.com/scripts/jsonwrapper.html json_(en|de)code pour les versions antérieures de PHP
robertbasic
et si j'ai un tableau quelque part imbriqué à l'intérieur $post_data. Cela ferait aussi d'eux des objets, n'est-ce pas?
ProblemsOfSumit
echo json_encode (array ('item' => $ post_data)); créera la structure JSON de: Object, Array, Object. ou: {[{C'est exactement ce que je cherchais, importer la réponse MySQL JSON dans une application iOS :-) MERCI Cristian !!!
Jacob Topping
63

Bien que les autres réponses publiées ici fonctionnent, je trouve l'approche suivante plus naturelle:

$obj = (object) [
    'aString' => 'some string',
    'anArray' => [ 1, 2, 3 ]
];

echo json_encode($obj);
theDmi
la source
1
Cette réponse est si bonne. Aussi lorsque vous ne contrôlez pas exactement quand un objet va être encodé ou si vous voulez encoder un tableau d'objets: alors la réponse JSON_FORCE_OBJECT ne fonctionne pas. De l'autre côté, c'est beaucoup plus lisible. Merci!
Natxet
Si vous recherchez un encodage qui commence en tant qu'objet et continue à contenir des tableaux, voici votre réponse.
suchislife
31

Vous avez juste besoin d'une autre couche dans votre tableau php:

$post_data = array(
  'item' => array(
    'item_type_id' => $item_type,
    'string_key' => $string_key,
    'string_value' => $string_value,
    'string_extra' => $string_extra,
    'is_public' => $public,
   'is_public_for_contacts' => $public_contacts
  )
);

echo json_encode($post_data);
zeusstl
la source
1
$post_data = [
  "item" => [
    'item_type_id' => $item_type,
    'string_key' => $string_key,
    'string_value' => $string_value,
    'string_extra' => $string_extra,
    'is_public' => $public,
    'is_public_for_contacts' => $public_contacts
  ]
];

$post_data = json_encode(post_data);
$post_data = json_decode(post_data);
return $post_data;
Alauddin Afif Cassandra
la source
1

Vous pouvez json encoder un objet générique.

$post_data = new stdClass();
$post_data->item = new stdClass();
$post_data->item->item_type_id = $item_type;
$post_data->item->string_key = $string_key;
$post_data->item->string_value = $string_value;
$post_data->item->string_extra = $string_extra;
$post_data->item->is_public = $public;
$post_data->item->is_public_for_contacts = $public_contacts;
echo json_encode($post_data);
Mitesh
la source