web-dev-qa-db-fra.com

Obtenir des données structurées à partir de JInputJSON

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.

1
John Rix

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 Joomla Doc

Source de classe JInput

JInputJson Class Soure

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');
1
Dennis Heiden

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)

0
itoctopus