Si j'envoie à mon contrôleur une chaîne JSON contenant un objet imbriqué, plutôt qu'un simple objet comportant un ensemble de propriétés scalaires, il ne semble pas que je dispose d'un moyen d'accéder efficacement à l'objet imbriqué. Si j'obtiens le nom de l'objet imbriqué, on me renvoie un tableau des valeurs de propriété de l'objet imbriqué, ce qui ne me sert pas à grand chose. Des allusions?
Exemple:
Envoi de ceci:
{"feedback":{"howhear":"Leaflet","comment":"Nice Joomla! site"}}
Et y accéder comme ça:
$app = JFactory::getApplication();
$jinput = $app->input->json;
$feedback = $jinput->get('feedback');
Me donne juste:
[ "Leaflet", "Nice Joomla! site" ]
Puis-je obtenir l'objet à la place en utilisant JInputJSON, ou dois-je revenir à la gestion des données brutes POST, par exemple via php: // input
MODIFIER:
Pour clarifier, le principal avantage que je souhaite d’utiliser JInputJSON réside dans les capacités de filtrage qu’il offre. Je sais que json_decode est disponible pour la tâche, mais il ne fournit aucun filtrage, par exemple. combattre les attaques par injection SQL.
Comment faites-vous les demandes?
J'ai fait quelque chose comme ce qui suit dans mes projets:
$jinput = JFactory::getApplication()->input->json;
$feedback = $jinput->get('feedback', array(), 'array'); // will return your array with keys
Pour obtenir des éléments imbriqués avec des filtres: Vous pouvez également imbriquer des tableaux pour obtenir des hiérarchies de valeurs plus complexes:
$fooValues = $jinput->getArray(array(
'feedback' => array(
'comment' => 'string',
'someint' => 'int'
)
));
Source: https://docs.joomla.org/Retrieving_request_data_using_JInput
Informations supplémentaires pour les utilisateurs de JinputJson:
JinputJson étend simplement Jinput et modifie $ this-> data en JSON codé (sous forme de tableau). Vous pouvez ensuite récupérer les données avec la fonction get.
Je recommanderais de construire votre objet JSON comme {"comment": "abc", "howhear": "abc"}, afin que vous puissiez utiliser directement le filtre sur les entrées:
$feedback['comment'] = $jinput->get('comment', '', 'string');
Comme l'un des commentaires l'a dit, pourquoi ne pas utiliser json_decode?
$objJSon = json_decode($json); //if you want you can add true as a second
Vous pouvez ensuite récupérer les valeurs de $objJSon
. Encore une fois, si vous voulez un tableau associatif, changez simplement json_decode($json)
en json_decode($json, true)