2

データベースを使用する PHP コードを書いています。そのために、配列をハッシュマップとして使用します。DB にコンテンツが追加または削除されるたびに、ファイルに保存します。

私は自分の DB 構造によってこの方法を使用することを余儀なくされており、mysql やその他の標準 DB を使用することはできません (学校のプロジェクトなので、構造はそのままです)。

私は2つの機能を構築しました:

function saveDB($db){
    $json_db = json_encode($db);
    file_put_contents("wordsDB.json", $json_db);
} // saveDB

function loadDB(){
    $json_db = file_get_contents("wordsDB.json");
    return json_decode($json_db, true);
} // loadDB

エンコード後またはファイルからの読み込み後に取得した文字列をエコーすると、有効な json が返されます (json ビューアーでjson_decode()テストしましたvar_dump())。

json 文字列自体は非常に長いです (~200,000 文字、これはテスト用です)。

私は次のことを試しました:

  • 単一/二重引用符を二重/単一引用符に置き換えます (バックスラッシュなしで、1 つのバックスラッシュと 3 つのバックスラッシュを使用します。また、元の文字列と置換された文字列でバックスラッシュの数が異なると考えられる任意の組み合わせ)、手動とstr_replace().
  • json 文字列の前後に引用符を追加します。
  • ページのエンコーディングを変更します。
  • ファイルに保存せずにデコードします (エンコード直後)。
  • スラッシュとバックスラッシュをチェックしました。何も見つかりません。
  • 試してみaddslashes()ました。
  • さまざまな「エスケープ文字列」バリアントを使用してみました。

json_last_error()動作しません。エラー番号が表示されません (0 ではなく null を取得します)。

これは私のサーバーではないため、使用されている PHP のバージョンがわからず、何もアップグレード/ダウングレード/インストールできません。

小さい弦はうまく機能するように見えるので、サイズが関係していると思います。

みんなありがとう:)

4

4 に答える 4

3

ファイルがUTF8でエンコードされているかどうかを確認してください。json_decodeUTF8でエンコードされたデータでのみ機能します。

編集:アップロードされたJSONデータを見た後、いくつか掘り下げてみたところ、「null」キーがあることがわかりました。検索する:

"exceeding":{"S01E01.html":{"2217":1}}、null:{"S01E01.html":

そのnullを有効なプロパティ名に変更json_decodeすると、ジョブが実行されます。

于 2012-08-08T20:10:14.927 に答える
2

JSON ファイルで null を「null」に変更すると、問題が解決します。

于 2012-08-14T16:30:29.910 に答える
0

偶然にも..そして、OPの問題ではなく、このスレッドにヒットした人にとってはもっと...私は次のことを見逃しました.誰かがコールスタックで私の上にhtmlentities($json)を持っていました. 同じものに噛まれていないことを確認し、html ソースを確認してください。

キックセルフ #124

于 2013-12-09T10:10:43.593 に答える
0

先週も同様の問題がありました。jsonlint.comによると、私のjsonは有効でした。

私のjson文字列には#と&が含まれており、これら2つはjson_decodeが失敗してnullを返しました。

失敗したところで停止する var_dump(json_decode($myvar)) を使用することで、問題の原因を突き止めることができました。

var_dumping と find dunction を使用して、これらの王様の文字を探すことをお勧めします。

于 2012-08-08T20:15:35.940 に答える