web-dev-qa-db-ja.com

JavaScriptを使用して改行文字を含むJSON文字列をエスケープする方法

値に改行文字が含まれるJSON文字列を形成する必要があります。これはエスケープしてからAJAX callを使用して投稿する必要があります。誰もがJavaScriptで文字列をエスケープする方法を提案できますか。私はjQueryを使っていません。

146
Srikant

あなたのJSONと.stringify()それを取りなさい。それから.replace()メソッドを使用し、すべての\n\\nに置き換えます。

編集:

私の知る限りでは、文字列内のすべての特殊文字をエスケープするための有名なJSライブラリはありません。しかし、.replace()メソッドをチェーニングして、次のようなすべての特殊文字を置き換えることができます。

var myJSONString = JSON.stringify(myJSON);
var myEscapedJSONString = myJSONString.replace(/\\n/g, "\\n")
                                      .replace(/\\'/g, "\\'")
                                      .replace(/\\"/g, '\\"')
                                      .replace(/\\&/g, "\\&")
                                      .replace(/\\r/g, "\\r")
                                      .replace(/\\t/g, "\\t")
                                      .replace(/\\b/g, "\\b")
                                      .replace(/\\f/g, "\\f");
// myEscapedJSONString is now ready to be POST'ed to the server. 

しかし、それはかなり厄介ですね。コードを細かく分割して、スクリプトのメインフローをきれいに保ち、8つの.replace()呼び出しを回避することができるという点で、関数の美しさを入力してください。それでは、その機能をescapeSpecialChars()という関数に入れてみましょう。先に進み、それをStringオブジェクトのprototype chainに添付してみましょう。そうすれば、Stringオブジェクトで直接escapeSpecialChars()を呼び出すことができます。

そのようです:

String.prototype.escapeSpecialChars = function() {
    return this.replace(/\\n/g, "\\n")
               .replace(/\\'/g, "\\'")
               .replace(/\\"/g, '\\"')
               .replace(/\\&/g, "\\&")
               .replace(/\\r/g, "\\r")
               .replace(/\\t/g, "\\t")
               .replace(/\\b/g, "\\b")
               .replace(/\\f/g, "\\f");
};

その関数を定義したら、コードの本体は次のように単純になります。

var myJSONString = JSON.stringify(myJSON);
var myEscapedJSONString = myJSONString.escapeSpecialChars();
// myEscapedJSONString is now ready to be POST'ed to the server
127
Alex

最初にバックスラッシュの置き換えを並べ替え、見積もりの​​置き換えを修正することを除いて、user667073が提案したとおり

escape = function (str) {
  return str
    .replace(/[\\]/g, '\\\\')
    .replace(/[\"]/g, '\\\"')
    .replace(/[\/]/g, '\\/')
    .replace(/[\b]/g, '\\b')
    .replace(/[\f]/g, '\\f')
    .replace(/[\n]/g, '\\n')
    .replace(/[\r]/g, '\\r')
    .replace(/[\t]/g, '\\t');
};
62
Ryan

あなたのように、私はいくつかのコメントと投稿を調べて、その中にhtmlオブジェクトを含む私のJSONの中の特別なエスケープ文字を置き換えることを考えています。

私の目的は、JSONオブジェクト内の特殊文字を削除し、jsonオブジェクト内のHTMLをレンダリングすることです。

これが私がしたことで、とても簡単に使えることを願います。

最初にJSONオブジェクトをJSON.string化し、その結果をJSON.parseしました。

例えば:

JSON.parse(JSON.stringify(jsonObject));

そしてそれは私の問題を解決し、Pure Javascriptを使ってやりました。

24
Balasubramani M

私は、アレックスの答えは、それを穏やかに言うと、かなり間違っていると言うのが怖いです。

  • アレックスがエスケープしようとするいくつかの文字は(&や 'のように)まったくエスケープする必要はありません。
  • \ bはまったくバックスペース文字ではなく、むしろWordの境界マッチです。
  • エスケープする必要がある文字は処理されません。

この機能

escape = function (str) {
    // TODO: escape %x75 4HEXDIG ?? chars
    return str
      .replace(/[\"]/g, '\\"')
      .replace(/[\\]/g, '\\\\')
      .replace(/[\/]/g, '\\/')
      .replace(/[\b]/g, '\\b')
      .replace(/[\f]/g, '\\f')
      .replace(/[\n]/g, '\\n')
      .replace(/[\r]/g, '\\r')
      .replace(/[\t]/g, '\\t')
    ; };

より良い近似であるように見えます。

21
whaefelinger

一重引用符の小さなアップデート

function escape (key, val) {
    if (typeof(val)!="string") return val;
    return val      
        .replace(/[\\]/g, '\\\\')
        .replace(/[\/]/g, '\\/')
        .replace(/[\b]/g, '\\b')
        .replace(/[\f]/g, '\\f')
        .replace(/[\n]/g, '\\n')
        .replace(/[\r]/g, '\\r')
        .replace(/[\t]/g, '\\t')
        .replace(/[\"]/g, '\\"')
        .replace(/\\'/g, "\\'"); 
}

var myJSONString = JSON.stringify(myJSON,escape);
10
Akash Dhawale

これは古い投稿です。しかし、それはangular.fromJsonとJSON.stringifyを使っている人にはまだ役に立つかもしれません。 escape()は推奨されていません。代わりにこれを使ってください。

var uri_enc = encodeURIComponent(uri); //before you post the contents
var uri_dec = decodeURIComponent(uri_enc); //before you display/use the contents.

ref http://www.w3schools.com/jsref/jsref_decodeuricomponent.asp

6
Sam

JSON.stringifyには2番目のパラメーターもあります。だから、もっと洗練された解決策は次のようになります。

function escape (key, val) {
    if (typeof(val)!="string") return val;
    return val
      .replace(/[\"]/g, '\\"')
      .replace(/[\\]/g, '\\\\')
      .replace(/[\/]/g, '\\/')
      .replace(/[\b]/g, '\\b')
      .replace(/[\f]/g, '\\f')
      .replace(/[\n]/g, '\\n')
      .replace(/[\r]/g, '\\r')
      .replace(/[\t]/g, '\\t')
    ; 
}

var myJSONString = JSON.stringify(myJSON,escape);
5

これは古い質問ですが、解決策がすべてのケースを解決するわけではなかったので、解決策は私にはうまくいきませんでした。私はついに仕事をした答えを見つけました ここ

私はescapeとencode uri componentの両方を組み合わせた解決策を投稿します。

// implement JSON stringify serialization
JSON.stringify = JSON.stringify || function (obj) {
    var t = typeof (obj);
    if (t != "object" || obj === null) {
        // simple data type
        if (t == "string") obj = '"'+obj+'"';
        return String(obj);
    }
    else {
        // recurse array or object
        var n, v, json = [], arr = (obj && obj.constructor == Array);
        for (n in obj) {
            v = obj[n]; t = typeof(v);
            if (t == "string") v = '"'+v+'"';
            else if (t == "object" && v !== null) v = JSON.stringify(v);
            json.Push((arr ? "" : '"' + n + '":') + String(v));
        }
        var rawString = (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");
       return rawString;
    }
};
function escape (key, val) {
    if (typeof(val)!="string") return val;

    var replaced = encodeURIComponent(val);
    return replaced;
}

JSON.stringifyEscaped = function(obj){
    return JSON.stringify(obj,escape);
}
4
Mitzi

私のAjax呼び出しの1つでも同じ状況になりました。Textareaフィールドの改行が原因でJSONがエラーをスローしていました。ここで与えられた解決策は私にはうまくいきませんでした。だから私はJavascriptの.escape関数を使用し、それはうまくいきました。それからJSONから値を取得するために、.unescapeを使用してエスケープ解除しただけです。

2
Anubhav Trivedi

テキスト領域から値を抽出して入力をURLエンコードするために、組み込みの jQuery.serialize() を使用しました。長所は、あなたが自分ですべての特別な文字を置き換える検索をする必要がないということです、そしてまた私は改行を保ち、HTMLをエスケープします。シリアライズを機能させるには、入力フィールドにname属性を設定する必要があるように思われます。また、エスケープ文字列に同じ属性を追加して置き換える必要があります。あなたが探しているものではないかもしれませんが、それは私のために働きます。

var myinputfield = jQuery("#myinputfield"); 
var text = myinputfield.serialize();
text = text.replace(myinputfield.attr('name') + '=','');
1
Janspeed

あらゆる形式のAjaxを使用する場合、CGIサーバーから受信した応答の形式に関する詳細な文書はWeb上では欠けているようです。 jQueryによる自動またはJavascriptシステムまたはライブラリのJSON構文解析を使用した手動のどちらで行われた場合でも、返されるテキストまたはJSONデータの改行はJSON変換の無限ループ(ハング)を防ぐためにエスケープする必要があります呼び出します。

プログラマーがこの問題を投稿するたびに、不適切な解決策が提示され(ほとんどの場合、送信側で\ nを\\ nに置き換える)、問題は解決されます。 Windowsのパス名など、誤ってコントロールエスケープシーケンスを埋め込んでいる文字列値を渡すと、それらの不適切性が明らかになります。例は "C:\ Chris\Roberts.php"で、これには制御文字^ cと^ rが含まれています。これにより、文字列{"file": "C:\ Chris\Roberts.php"}がJSONに変換されます。永遠にループします。そのような値を生成する1つの方法は、意図的にPHP警告およびエラーメッセージをサーバーからクライアントに渡すことです。これは合理的な考えです。

定義上、Ajaxは舞台裏でHTTP接続を使用します。このような接続はGETとPOSTを使用してデータを渡しますが、どちらも制御文字を含む誤った構文を避けるために送信データをエンコードする必要があります。

これは解決策と思われるものを構築するのに十分なヒントを与えます(もっとテストが必要です):PHP(送信側)でrawurlencodeを使用してデータをエンコードし、Javascriptで受信解除(受信)データをデコードする側。場合によっては、これらをテキスト文字列全体に適用することもあれば、JSON内の値にのみ適用することもあります。

この考えが正しいと判明した場合は、すべてのレベルのプログラマーがこの問題を一度に解決できるように、簡単な例を作成できます。

1
David Spector

サーバサイドのスクリプト言語がphpの場合はjson_encode()を使用し、json_encode()は改行とその他の予期しないトークンをエスケープします(phpでない場合は、スクリプト言語と似た機能を探します)。

それなら、JavaScriptで$ .parseJSON()を使ってください。

1
avngr

JSON.parse(yourUnescapedJson);を使うほうがいいです

0
Mohit Vachhani

文字列をエンコードするには、encodeURIComponent()を使用します。

例えば。 var myEscapedJSONString = encodeURIComponent(JSON.stringify(myJSON));

Webサーバーが自動的に同じことをするのでそれをデコードする必要はありません。

0

これは本当に古くからの投稿です:-)しかし、これを100%達成するための最善の回避策は、base64へのエンコード/デコードの両方の機能を使用することです。これらはatob()とbtoa()です。はるかに簡単で最善の方法では、あなたがエスケープするために任意の文字を逃した場合心配する必要はありません。

ジョージ

0
Giorgoc