4

文字列を JSON に解析しようとすると、予期しないトークン エラーが発生します。

http://json.parser.online.fr/を使用して有効性をチェックしていますが、解析エラーは発生しませんが、予期しないトークンが原因で評価が失敗したと言っています。以下の JSON をその Web サイトに貼り付けると、エラーが検出されていることがわかりますが、原因となっているトークンは特定されていません。

これが私が解析しようとしているものです。

{
    "Polish": {
        "Rent": [
            {
                "english": "a",
                "audioUrl": "b",
                "alternate": "c"
            },
            {
                "english": "d",
                "audioUrl": "e",
                "alternate": "f"
            }
        ]
    }
}

明らかな何かが欠けていますか?


編集
「Rent」キーの後の : と [ の間に印刷できない文字があります。

問題を引き起こしている可能性がある解析試行の前に、文字列に対していくつかの replace() 呼び出しを行っています。

特定の行が解析される前に

"Rent":"[

: と [ 記号の間の二重引用符を削除したい。

だから私は使用しています:

var reg = new RegExp('":"', 'g');
var newStr = originalStr.replace(reg, '":');

ただし、上記が印刷できない文字を引き起こしている理由はわかりません。


EDIT2
上記のreplace()呼び出しを削除してバリデーターに貼り付け、replace()を使用していた二重引用符を手動で削除しましたが、判読できない文字がまだ残っています。したがって、エラーは元の文字列に存在します。より多くのコード:|

文字列は、サーバー上にある PHP スクリプトへの ajax 呼び出しから返されます。PHP スクリプトはサーバー上のディレクトリを読み取り、ネストされた連想配列に値を入力して文字列を生成します。この文字列は JS 側に送り返され、JS 側で編集および解析されます (上記を参照)。

ディレクトリ内には JSON ファイルがあり、その内容をこのネストされた配列構造に挿入して、JSON 階層を完成させます。

読めなかった文字は

エフ bb BF

私がグーグルで調べたところ、ファイルの内容を表す文字列のバイトオーダーマークであることがわかりました。

ディレクトリとJSONファイルを読み取り、JSON_encode()dでネストされた配列構造を作成してJSに送り返すPHPコードを次に示します。

if ($langHandle = opendir($langDir)) {
while (false !== ($langEntry = readdir($langHandle))) {
    $currentLangDir = $langDir . "/" . $langEntry;
    if (is_dir($currentLangDir) && $langEntry != '.' && $langEntry != '..') {
        $currentLang = array();
        if ($currentLangHandle = opendir($currentLangDir)) {
            while (false !== ($catEntry = readdir($currentLangHandle))) {
                $currentCatFile = $currentLangDir . "/" . $catEntry;
                if(is_file($currentCatFile) && $catEntry != '.' && $catEntry != '..') {
                    $currentCat = file_get_contents($currentCatFile);
                    $currentLang[removeFileExtension($catEntry)] = $currentCat;
                }
            }
        }
        $langArray[$langEntry] = $currentLang;
    }
}

これらの不要な文字を修正するにはどうすればよいですか。BOM 文字を削除する方法をすばやく検索すると、それは悪いことであることがわかります。

4

2 に答える 2

6

おそらく、質問に貼り付けたものに表示されない印刷できない文字があります。あなたが提供したリンクにあるオンライン パーサーにあなたのテキストをコピー アンド ペーストしたところ、きれいに解析されました。

元のテキストをコピーしてこのオンライン hex dump Web サイトに貼り付けてみて、上記の SO の質問からコピーして貼り付けたときに得られるものと比較してください...それらが異なる場合は、偽の文字がどこにあるかの手がかりが得られます。 .

これは私が得た出力のスクリーンショットで、きれいに解析されます。

ここに画像の説明を入力

于 2013-09-20T15:46:23.280 に答える
0

仲間、私は同様の問題を抱えていました。ファイルエンコーディング(UTF-8)と(UTF-8 WITHOUT BOM)が違いを生む可能性があることを確認してください。

于 2013-12-13T22:41:31.350 に答える