2017-06-12 5 views
-2

サーバーからJSONでデータを取得する必要があります。データセットは非常に巨大で、複数レベルのネストがあります。私は配列を使う。そして配列の中のいくつかのキーはJSON文字列です(これらの文字列からJSオブジェクトを後で作成するために、これらの文字列をデータベース内に格納する必要があります)。PHP json_encode()とJavascript JSON.parse()

Array(
    'key1'=> 'value1', 
    'key2'=> 'string in JSON format', // json_encode('key2_value that may contain russian symbols', JSON_UNESCAPED_UNICODE) 
    'key3'=> array(
     'key1'=> array(
      key1=> 'string in JSON format' 
     ) 
    ) 
) 

要素の入れ子は任意で、任意の要素はJSON形式の文字列を含むことができます。

私はこの巨大な配列をPHPのjson_encode($data, JSON_UNESCAPED_UNICODE)関数を使用してJSONでエンコードします。データにはロシアのシンボルが含まれている可能性があるため、2番目のパラメータを使用します(後でそれらの文字列の一部を検索する必要があります)。その後、私は...データを受信

1ステップ:

デコードJS JSON.parse()関数を使用してJSON文字列を持つすべての配列。

2ステップ:

は、データベースの列にいくつかのJSON文字列を保存した後、JSON.parse()を使用してJSオブジェクトを作成します。

しかし、一部の文字列には、許可されていないJSON文字、特に '\ r'が含まれることがあります。 JSON解析を使用してこの文字列を解析しようとすると、JSON.parseエラーが2番目のステップで表示されます。しかし理論的には、それは第一段階でも起こり得る。

しかし、PHP json_decodeは正常に機能します。 JS JSON.parseが動作しません!

誰もが考えていることはありますか? (私がメイン配列でjson_encodeを使うときには、ロシアのシンボルも含まれているネストされたjson文字列もエスケープされています - スラッシュ、つまり "")。

+0

したがって、 'JSON_UNESCAPED_UNICODE'は使用しないでください。非常に壊れたブラウザを扱っていない限り、完全にエンコードされたデータには 'JSON.parse'には問題がありません。もしあなたがそうしたら、 '~~~ r'のようなプレースホルダを使うことができます。 'json_encode()'を実行する前に '\ r'をプレースホルダに置き換え、JSON.parse()を実行した後にプレースホルダを' \ r'に置き換えます。 「非常に巨大」という意味に応じて、パフォーマンスが低下することはありません。 –

+0

1つの質問: しかし、 '\ r'は許可されていない文字の1つです。私のデータセットは500kBサイズに近いです。また、json文字列のメイン配列内の特別なシンボルが再びエスケープされました。 2質問: 私はphonegapを使用してモバイルアンドロイドアプリケーションを作成します。私はsqliteデータベースを使用します。私がデータを挿入すると、JSON_UNESCAPED_UNICODEを持たないロシアのシンボルが含まれている可能性があります...もし私がデータベースのロシアのシンボルを検索すると、問題はありますか? –

+0

私は本当にあなたのコメントに従わないことを恐れています。私はリテラルの復帰がJSONでは有効ではないことを理解しています。そのため、エンコードする必要があります。なぜそれをエンコーディングするのが問題なのかは分かりません。 JSON.parseは、エンコードされたデータを正しく解釈する必要があります。 –

答えて

0

あなたは私を理解できませんでした...私の問題の2つの解決策を見つけました!!!!!!!

  1. JSON_UNESCAPED_UNICODEフィルタを使用してjson形式の内部要素を含むJSON_UNESCAPED_UNICODEフィルタのメイン配列でエンコードされています。

(内部素子がデータベースに解析されていない保存されます)

それはそれをコピーして、コンソールにそれを解析しようとした後、私は、ブラウザで私のJSONの行を印刷します。それは正常に解析されました。しかし、私はjson形式で内部プロパティの値を解析しようとすると、私は特殊文字の位置に解析エラーを持っています。

私はこの行を私のアプリケーションで受け取り、json形式の内部プロパティ値を含むGOODを解析しました!

  1. JSON_UNESCAPED_UNICODEフィルタは使用できません。

メインアレイを解析します。データベースにロシアのシンボルを含む通常の文字列を貼り付けます。私はデータベース内の検索を使用することができます。しかし、jsonの文字列をロシア語の文字列でデータベースに貼り付けると、 '\ u0413 \ u043e \ u0440 \ u043e \ u0434'のように貼り付けられ、検索は使用できません。

私の解決方法は、JSON.stringify(JSON.parse( 'JSON string'))です。これをデータベースに貼り付けます。この場合、正しく貼り付けられ、検索を使用できます。