3

次のコードがあります。

$param = $params[0];
var_dump($param->getValue());
$test = json_decode($param->getValue());
var_dump($test);

私の最初の var_dump は次を返します:

string(133) ""[{\"lang_id\": \"1\", \"naam\": \"dsfsdfds\", \"mail\": \"dsfdsfs\"}, {\"lang_id\": \"1\", \"naam\": \"dfsd\", \"mail\": \"dfds\"}]""

2番目のものは次を返します:

string(107) "[{"lang_id": "1", "naam": "dsfsdfds", "mail": "dsfdsfs"}, {"lang_id": "1", "naam": "dfsd", "mail": "dfds"}]" 

値は次のように DB に保存されます。

"[{\"lang_id\": \"1\", \"naam\": \"dsfsdfds\", \"mail\": \"dsfdsfs\"}, {\"lang_id\": \"1\", \"naam\": \"dfsd\", \"mail\": \"dfds\"}]"

今私の質問は: json_decode の後に文字列を返すのはなぜですか? 何が間違っているのかまったくわかりません。最も奇妙なことは、変数をその変数の実際の値に置き換えると、デコードが正しいことです。

$test = json_decode("[{\"lang_id\": \"1\", \"naam\": \"dsfsdfds\", \"mail\": \"dsfdsfs\"}, {\"lang_id\": \"1\", \"naam\": \"dfsd\", \"mail\": \"dfds\"}]");

戻り値

array(2) { 
    [0]=> object(stdClass)#3255 (3) { 
        ["lang_id"]=> string(1) "1" 
        ["naam"]=> string(8) "dsfsdfds" 
        ["mail"]=> string(7) "dsfdsfs" 
     } 
    [1]=> object(stdClass)#3256 (3) { 
        ["lang_id"]=> string(1) "1" 
        ["naam"]=> string(4) "dfsd" 
        ["mail"]=> string(4) "dfds" 
     } 
}

私は何を間違っていますか?

4

3 に答える 3

4

文字列は json_encoded が2回あるため、2回デコードする必要があります。

string(133) ""[{\"lang_id\": \"1\", \"naam\": \"dsfsdfds\", \"mail\": \"dsfdsfs\"}, {\"lang_id\": \"1\", \"naam\": \"dfsd\", \"mail\": \"dfds\"}]""

上記の文字列を見ると、引用符がすべてエスケープされており、最初と最後に二重引用符があることがわかります。つまり、json デコードすると、エスケープされた引用符のない文字列が得られます。

再度デコードすると、文字列は配列にデコードされます。

json_decode('"[12,24,32]"'); //php string:  [12,24,32]
json_decode('[12,24,32]'); //php array(12, 24, 32);
于 2013-07-22T09:04:48.730 に答える
0

問題は、文字列全体が引用符で囲まれていることです。

これは JSON 文字列ですが、文字列変数を 1 つだけ含む JSON 文字列です....その文字列変数自体には有効な JSON 文字列が含まれていますが、JSON デコードに関する限り、その事実は無関係です。JSON a が単一の文字列変数であることがわかるだけです。

デコードされた出力に対してa を実行することで、これを証明できjson_decode()ます。その後、期待される配列を取得する必要があります。

データが何らかの形で二重にエンコードされているように見えます。したがって、2 回目のデコードを行うと目的の結果が得られますが、二重デコードによって問題を修正しようとするのではなく、二重エンコードが発生している場所を見つけて修正することをお勧めします。

それが役立つことを願っています。

于 2013-07-22T09:07:16.133 に答える
0

あなたの文字列は有効な json ではありません (エスケープ引用符)。

$atring = '[{"lang_id": "1", "naam": "dsfsdfds", "mail": "dsfdsfs"}, {"lang_id": "1", "naam": "dfsd", "mail": "dfds"}]';

JSON Fromatter ツールを使用して、文字列が有効な json かどうかを確認します。http://jsonformatter.curiousconcept.com/

于 2013-07-22T09:11:40.820 に答える