web-dev-qa-db-ja.com

JInputJSONから構造化データを取得する

一連のスカラープロパティを持つ単純なオブジェクトではなく、入れ子になったオブジェクトを含むコントローラーにJSON文字列を送信すると、入れ子になったオブジェクトに効率的にアクセスする方法がないようです。ネストされたオブジェクトの名前を「取得」すると、ネストされたオブジェクトのプロパティ値の配列が返されますが、これはあまり役に立ちません。ヒントはありますか?

例:

これを送る:

{"feedback":{"howhear":"Leaflet","comment":"Nice Joomla! site"}}

そして、このようにそれにアクセスします:

$app = JFactory::getApplication();
$jinput = $app->input->json;
$feedback = $jinput->get('feedback');

ちょうど私に与える:

[ "Leaflet", "Nice Joomla! site" ]

代わりにJInputJSONを使用してオブジェクトを取得できますか、それともraw POSTデータをphp:// input経由で)処理するためにフォールバックする必要がありますか?

編集:

明確にするために、JInputJSONを使用することで得られる主要な利点は、JInputJSONが提供するフィルタリング機能です。 json_decodeがタスクで使用できることは知っていますが、フィルタリングは提供されません。 SQLインジェクション攻撃と戦うため。

1
John Rix

どのようにリクエストを行いますか?

私のプロジェクトでは、次のようなことをしました。

$jinput = JFactory::getApplication()->input->json;
$feedback = $jinput->get('feedback', array(), 'array'); // will return your array with keys

フィルターを使用してネストされたアイテムを取得するには:配列をネストして、より複雑な値の階層を取得することもできます。

$fooValues = $jinput->getArray(array(
    'feedback' => array(
        'comment' => 'string',
        'someint' => 'int'
    )
));

ソース: https://docs.joomla.org/Retrieving_request_data_using_JInput

JinputJsonを使用する他の人のための追加情報:

JInputJson Joomla Doc

JInputクラスソース

JInputJsonクラスSoure

JinputJsonはJinputを拡張し、$ this-> dataをエンコードされたJSON(配列として)に変更します。その後、get関数を使用してデータを取得できます。

{"comment": "abc"、 "howhear": "abc"}のようなJSONオブジェクトを作成することをお勧めします。これにより、エントリでフィルターを直接使用できます:

$feedback['comment'] = $jinput->get('comment', '', 'string');
1
Dennis Heiden

コメントの1つが述べたように、なぜjson_decodeを使用しないのですか?

_$objJSon = json_decode($json); //if you want you can add true as a second 
_

次に、_$objJSon_から値を取得できます。繰り返しますが、連想配列が必要な場合は、json_decode($json)json_decode($json, true)に変更するだけです。

0
itoctopus