14

json_encodeでいくつかの問題に直面しています。

新しい行を持つ配列をjson_encodeすると、新しい行がエスケープされず、代わりに\が削除されてnが保持されます。

ex: $array = array('name'=> "some text \n\r text");
$results = json_encode($array);

データベースに保存some text nr textしています。

私はを使用してphp 5.3.8います。

編集:

これは私が使用している私の元のコードです

$attr = array();
for($i=0; $i < count($_POST['key']); $i++){
    $attr[$_POST['key'][$i]] = $_POST['value'][$i];
}
echo json_encode(array('custom' => $attr));

これらのPOST値はフォームから取得します。

4

7 に答える 7

10

改行は、JSON文字列内の有効な文字ではありません。これが予想される動作です。

char

"または\または制御文字以外のUnicode文字

  • \ "
  • \
  • /
  • \ b
  • \ f
  • \ n
  • \ r
  • \ t
  • \u4桁の16進数

JSONは、これらの制御文字をリスト内の制御文字にエスケープします。

これで、'\n'(文字通りバックスラッシュの後に「n」が続く)ができました。これは、適切にエスケープされていない場合、データベースにとして保存されますn。そして、それはあなたが経験している問題です。

ソリューション

プリペアドステートメントを使用して、データベースに格納している文字列内のすべてのスラッシュを適切にエスケープします。これにより、それらがとして保存され、データを取得するときに'\n'変換できます。"\n"

于 2012-06-29T15:36:30.113 に答える
6

json_encodeがあなたの問題だとは思わない。私の推測では、データベースは\をエスケープ文字として解釈しているので、単にそれらを削除します。

これに対抗するには、 addslashesを使用してエスケープ文字をエスケープするだけです。

$results=addslashes($results);
于 2012-06-29T15:33:50.100 に答える
3

手動でエスケープすることができます:

$array = array('name'=> "some text \n\r text");

$results = json_encode(array_filter($array, function($arr) use ($array){
        return preg_replace('~\\[nrtfd]~', '\\\\$1', $arr);
}));

print_r($results);

独自のjson_encode関数を拡張し、の使用を次のように置き換えることができjson_encodeますmy_json_encode

function my_json_encode($json){
    $results = json_encode(array_filter($json, function($arr) use ($array){
        return preg_replace('~\\[nrtfd]~', '\\\\$1', $arr);
    }));

    return $results;
}

print_r($results);

{"name":"some text \n\r text"}参考までに、上記は次のようになります。{"name":"some text nr text"}

于 2012-06-29T15:35:55.177 に答える
1

私はこの問題を理解しました。json_encodeの問題ではありません。データベースへの保存中にエラーが発生しました。

問題は、サーバーでmagic_quotes_gpcが有効になっていることです。私のアプリケーションでは、magic_quotesが有効になっている場合、スラッシュをストライピングしています。

magic_quotes_gpcを無効にしました。今は正常に動作しています。

すべての体に感謝します。

于 2012-06-30T04:10:57.613 に答える
1

このコマンドを使用して、円記号をクリーンアップします。

$info = file_get_contents('my_file.txt');
**$info = str_replace(array("r\n","\n", "\r"), "", $info);**    
$info = json_decode($info);
于 2021-11-05T05:34:41.363 に答える
1

JSON_PRETTY_PRINTPHPマニュアルの説明に従って使用できます。

https://www.php.net/manual/function.json-encode.php

于 2021-12-05T08:28:46.143 に答える
0

PHP_EOL新しい行に使用できます。改行を含める場所は、必要な方法によって異なります。以下の場合、最後の閉じ角括弧と各中括弧の後に改行が必要です。

tit1: {
"prop1" : [ "", "", []], 
"prop2" : [ "", "", []]
}, 
tit2: {
"prop1" : [ "", "", []], 
"prop2" : [ "", "", []]
}

機能は

$jsonDataTxt = $this->own_format_json($jsonData);
file_put_contents("C:/Users/mm/Documents/Data.json", $jsonDataTxt);


function own_format_json($json, $html = false) {
        $tabcount = 0; 
        $result = ''; 
        $bnew = 0;
        $brack=0;  
        $tab = "\t"; 
        $newline = PHP_EOL; 
        for($i = 0; $i < strlen($json); $i++) { 
            $char = $json[$i]; 
            if($char!==',' && $bnew===1) { $bnew=0; $result.=  $newline; } //insert new line after ], which is not proceeded by ,
            switch($char) { 
                case '{': 
                    $tabcount++; 
                    $result .= $char . $newline . str_repeat($tab, $tabcount); 
                    break; 
                case '}': 
                    $tabcount--; 
                    $result = trim($result) . $newline . str_repeat($tab, $tabcount) . $char . $newline; 
                    break; 
                case '[': 
                    $brack++; 
                    $result .= $char;// . $newline . str_repeat($tab, $tabcount); 
                    break; 
                case ']': 
                    $brack--;
                    $result .= $char;// . $newline . str_repeat($tab, $tabcount); 
                    if($brack===0) { $bnew=1; }
                    //echo "<br><br> case  ]  char=".$char.',   brack='.$brack. ",  bnew=".$bnew.",   result=".$result ; 
                    break; 
                case ',': 
                    $result .= $char;// . $newline . str_repeat($tab, $tabcount); 
                    if($bnew===1) { $bnew=0; $result.=  $newline; } //insert new line after ],
                    break; 
                case '"': 
                    $result .= $char; 
                    break; 
                default: 
                    $result .= $char; 
            } 
        } 
    return $result; 
   }
于 2016-09-04T17:45:47.300 に答える