JSON文字列を配列に変換する方法


123

私がしたいことは次のとおりです:

  1. PHPのテキスト領域からの入力としてJSONを取る
  2. この入力を使用してJSONに変換し、php curlに渡してリクエストを送信します。

this m get of api from php from this json string want to pass to json to json but it not Convert to array

echo $str='{
        action : "create",
        record: {
            type: "n$product",
            fields: {
                n$name: "Bread",
                n$price: 2.11
            },
            namespaces: { "my.demo": "n" }
        }
    }';
    $json = json_decode($str, true);

上記のコードは配列を返しません。


1
json文字列を配列に変換する必要がありますか、それともそのデータからURLを偽造しますか?質問は正確には何ですか?
Janis Veinbergs、2011

then it is not giving何を与えていませんか?textareaからJSON形式の文字列を取得し、それをJSONに変換しますか?
PeeHaa 2011

1
私の質問json_decode(、true)で上記のjsonを実行すると、配列が返されます
XMen

@Pekkaもう一度クイズトンをチェックしてください。
XMen、2011

3
これは無効なjson問題でした。
XMen、2011

回答:


187

投稿でJSONをに渡すと、json_decode失敗します。有効なJSON文字列には引用符で囲まれたキーがあります:

json_decode('{foo:"bar"}');         // this fails
json_decode('{"foo":"bar"}', true); // returns array("foo" => "bar")
json_decode('{"foo":"bar"}');       // returns an object, not an array.

私の質問json_decode(、true)で上記のjsonを実行すると、配列が返されます
XMen

@RahulMehta PHPのビルトインを使用しjson_decode()ているNULL場合、JSONが無効な場合(たとえば、引用符で囲まれたキーがない場合)に返されます。それがドキュメントに書かれていることであり、それが私のPHP 5.2インストールが返すものです。公式の組み込み以外の機能を使用していjson_decode()ますか?何がvar_dump(json_decode($str, true));戻りますか?
RickN、2011

json_encodingの後で、個々のjsonオブジェクト、たとえば{foo: "bar"}を配列内のオブジェクトとして読み取ります。json_encodedデータから配列を作成して各jsonオブジェクトを読み取るにはどうすればよいですか?@RikkusRukkus
Manny265

@ Manny265は、このコメントセクションではなく、(1)サンプルコード、(2)これまでに試した内容、および(3)予期される結果で、独自の質問に値するもののように聞こえます。
RickN 2018年

96

これを試して:

$data = json_decode($your_json_string, TRUE);

2番目のパラメーターは、デコードされたjson文字列を連想配列にします。


30

あなたが使用してフォームからJSON文字列を取得している場合$_REQUEST$_GETまたは$_POSTあなたは、関数を使用する必要がありますhtml_entity_decode()var_dumpリクエストの内容とコピー先のechoステートメントを比較して、リクエスト文字列がはるかに大きいことに気づくまで、これに気付きませんでした。

正しい方法:

$jsonText = $_REQUEST['myJSON'];
$decodedText = html_entity_decode($jsonText);
$myArray = json_decode($decodedText, true);

エラーあり:

$jsonText = $_REQUEST['myJSON'];
$myArray = json_decode($jsonText, true);
echo json_last_error(); //Returns 4 - Syntax error;

2
完璧です、これでうまくいきます。$ _POST関数からデータを取得すると、json_last_error()は== JSON_ERROR_SYNTAXになりました。しかし、すべては常に大丈夫でした。ASCIIやutf8のようなエンコードのエラーではなく、デコードのエラーでした。THANKS

11

使用する json_decode($json_string, TRUE)配列にJSONオブジェクトを変換する機能。

例:

$json_string   = '{"a":1,"b":2,"c":3,"d":4,"e":5}';

$my_array_data = json_decode($json_string, TRUE);

注:2番目のパラメーターは、デコードされたJSON文字列を連想配列に変換します。

===========

出力:

var_dump($my_array_data);

array(5) {

    ["a"] => int(1)
    ["b"] => int(2)
    ["c"] => int(3)
    ["d"] => int(4)
    ["e"] => int(5)
}

6

を使用してURLからjson文字列を取得する場合はfile_get_contents、次の手順に従います。

$url = "http://localhost/rest/users";  //The url from where you are getting the contents
$response = (file_get_contents($url)); //Converting in json string
 $n = strpos($response, "[");
$response = substr_replace($response,"",0,$n+1);
$response = substr_replace($response, "" , -1,1);
print_r(json_decode($response,true));

6

文字列は次の形式である必要があります。

$str = '{"action": "create","record": {"type": "n$product","fields": {"n$name": "Bread","n$price": 2.11},"namespaces": { "my.demo": "n" }}}';
$array = json_decode($str, true);

echo "<pre>";
print_r($array);

出力:

Array
 (
    [action] => create
    [record] => Array
        (
            [type] => n$product
            [fields] => Array
                (
                    [n$name] => Bread
                    [n$price] => 2.11
                )

            [namespaces] => Array
                (
                    [my.demo] => n
                )

        )

)

2

jsonオブジェクトを配列と文字列に変換できます。

$data='{"resultList":[{"id":"1839","displayName":"Analytics","subLine":""},{"id":"1015","displayName":"Automation","subLine":""},{"id":"1084","displayName":"Aviation","subLine":""},{"id":"554","displayName":"Apparel","subLine":""},{"id":"875","displayName":"Aerospace","subLine":""},{"id":"1990","displayName":"Account Reconciliation","subLine":""},{"id":"3657","displayName":"Android","subLine":""},{"id":"1262","displayName":"Apache","subLine":""},{"id":"1440","displayName":"Acting","subLine":""},{"id":"710","displayName":"Aircraft","subLine":""},{"id":"12187","displayName":"AAC","subLine":""}, {"id":"20365","displayName":"AAT","subLine":""}, {"id":"7849","displayName":"AAP","subLine":""}, {"id":"20511","displayName":"AACR2","subLine":""}, {"id":"28585","displayName":"AASHTO","subLine":""}, {"id":"45191","displayName":"AAMS","subLine":""}]}';

$b=json_decode($data);

$i=0;
while($b->{'resultList'}[$i])
{
    print_r($b->{'resultList'}[$i]->{'displayName'});
    echo "<br />";
    $i++;
}

1

JSONファイルまたは構造をすべての入れ子レベルでPHPスタイルの配列に変換する必要がある場合は、この関数を使用できます。まず、json_decode($ yourJSONdata)を実行してから、この関数に渡す必要があります。正しいPHPスタイルの配列がブラウザーウィンドウ(またはコンソール)に出力されます。

https://github.com/mobsted/jsontophparray


1
<?php
$str='{
    "action" : "create",
    "record" : {
                "type": "$product",
                "fields": {
                           "name": "Bread",
                           "price": "2.11"
                           },
                "namespaces": { "my.demo": "n" }
                }
    }';
echo $str;
echo "<br>";
$jsonstr = json_decode($str, true);
print_r($jsonstr);

?>

私はこれはうまくいくと思います、それが数字でない場合はキーも二重引用符で囲まれるべきだということです。


1

これが私の解決策:json string $columns_validation = string(1736) "[{"colId":"N_ni","hide":true,"aggFunc":null,"width":136,"pivotIndex":null,"pinned":null,"rowGroupIndex":null},{"colId":"J_2_fait","hide":true,"aggFunc":null,"width":67,"pivotIndex":null,"pinned":null,"rowGroupIndex":null}]"

だから私はそのようにjson_decodeを2回使用します:

$js_column_validation = json_decode($columns_validation);
$js_column_validation = json_decode($js_column_validation); 

var_dump($js_column_validation);

そして結果は:

 array(15) { [0]=> object(stdClass)#23 (7) { ["colId"]=> string(4) "N_ni" ["hide"]=> bool(true) ["aggFunc"]=> NULL ["width"]=> int(136) ["pivotIndex"]=> NULL ["pinned"]=> NULL ["rowGroupIndex"]=> NULL } [1]=> object(stdClass)#2130 (7) { ["colId"]=> string(8) "J_2_fait" ["hide"]=> bool(true) ["aggFunc"]=> NULL ["width"]=> int(67) ["pivotIndex"]=> NULL ["pinned"]=> NULL ["rowGroupIndex"]=> NULL }

Thankz bro ...あなたは私の日を救った
Nuwan Withanage '11 / 11/19

1

文字列が次のようなJSON形式であることを確認してください。

{"result":"success","testid":"1"} (with " ") .

そうでない場合は、"responsetype => json"リクエストパラメータを追加できます。

次に、を使用json_decode($response,true)して配列に変換します。


1
StackOverflowへようこそ:-)コミュニティは、それに貢献したいと考え、あなたの態度を高く評価してくれる新しいメンバーに常に満足しています。悲しいことに、別のメンバーがあなたの回答が反対票に値すると考えました。これは、質問自体が約7年前に行われ、すでに数回回答されているためです。さらに、このresponseTypeプロパティは、要求への応答でデータのタイプを決定するために使用されます。それでも問題は、リクエストの本文に正しい形式ではないデータが含まれていることです。したがって、あなたの答えは与えられた文脈に適合しません。
Philipp Maurer、2018年

1

次のように文字列をJSONに変更できます。必要に応じて、文字列をトリミングしたり、削除したりすることもできます。

$str     = '[{"id":1, "value":"Comfort Stretch"}]';
//here is JSON object
$filters = json_decode($str);

foreach($filters as $obj){
   $filter_id[] = $obj->id;
}

//here is your array from that JSON
$filter_id;

0

このコンバーターを使用してください。まったく失敗しません: Services_Json

// create a new instance of Services_JSON
$json = new Services_JSON();

// convert a complexe value to JSON notation, and send it to the browser
$value = array('foo', 'bar', array(1, 2, 'baz'), array(3, array(4)));
$output = $json->encode($value);
print($output);
// prints: ["foo","bar",[1,2,"baz"],[3,[4]]]

// accept incoming POST data, assumed to be in JSON notation
$input = file_get_contents('php://input', 1000000);
$value = $json->decode($input);

// if you want to convert json to php arrays:
$json = new Services_JSON(SERVICES_JSON_LOOSE_TYPE);

-2
$data = json_encode($result, true);

echo $data;

2
このコードは質問に答えることがありますが、このコードが質問に答える理由や方法に関する追加のコンテキストを提供すると、長期的な価値が向上します。
rollstuhlfahrer 2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.