値が改行文字を持つJSON文字列を形成する必要があります。これはエスケープして、AJAX呼び出しを使用してポストする必要があります。JavaScriptで文字列をエスケープする方法を誰でも提案できますか?私はjQueryを使用していません。
値が改行文字を持つJSON文字列を形成する必要があります。これはエスケープして、AJAX呼び出しを使用してポストする必要があります。JavaScriptで文字列をエスケープする方法を誰でも提案できますか?私はjQueryを使用していません。
回答:
あなたの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()
。それではprototype chain
、String
オブジェクトのにアタッチして、escapeSpecialChars()
Stringオブジェクトを直接呼び出すことができるようにします。
そのようです:
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
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');
};
Line separator
\u2028
そしてParagraph separator
\u2029
。参照:es5.github.io/#x7.3
Uncaught SyntaxError: Unexpected token \ in JSON at position 2
あなたと同じように、私はいくつかのコメントを調べ、htmlオブジェクトを含むJSONの特殊なエスケープ文字を置き換えるために投稿しています。
私の目的は、JSONオブジェクトの特殊文字を削除し、jsonオブジェクト内にあるhtmlをレンダリングすることです。
これが私がやったことであり、それが非常に簡単に使えることを願っています。
まず、jsonオブジェクトをJSON.stringifyし、結果をJSON.parseしました。
たとえば:
JSON.parse(JSON.stringify(jsonObject));
そしてそれは私の問題を解決し、純粋なJavascriptを使用して行われます。
stackoverflow
エラーで複雑で大きなオブジェクトで
JSON.parse(JSON.stringify($("body")))
本文といくつかのテーブルを含むhtmlファイルを試してください。$( "body")はJavaScriptオブジェクトですが、stringifyは解析に失敗します。
アレックスからの答えは、少し控えめに言って、かなり間違っていると思います。
この機能
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')
; };
より良い近似のようです。
単一引用符の小さな更新
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);
これは古い投稿です。ただし、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
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);
これは古い質問ですが、すべてのケースを解決することはできなかったため、ソリューションはうまく機能しませんでした。私はついにここで仕事をした答えを見つけました
エスケープとエンコードuriコンポーネントを使用した両方の解決策を投稿します。
// 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);
}
escape = (string) -> JSON.stringify(string)[1...-1]
サーバー側のスクリプト言語がPHPの場合は
json_encode()を使用しjson_encode()
、改行やその他の予期しないトークンをエスケープします(PHPを使用していない場合は、スクリプト言語に類似した関数を探します)
その後$.parseJSON()
、JavaScriptで使用します。
<script> windows.data_from_php = <?php echo json_encode(json_encode($arrayOrObjToJs)); ?>; var phpData = JSON.parse(windows.data_from_php); </script>
php JSON.parse double encode
JSON
Textareaフィールドの改行が原因でエラーがスローされたAjax呼び出しの1 つでも、同じ状況が発生しました。ここで与えられた解決策は私にはうまくいきませんでした。だから私はJavaScriptの.escape
機能を使用し、それはうまくいきました。次に、から値を取得するために、を使用してJSON
エスケープを解除しました.unescape
。
組み込みのjQuery.serialize()を使用してtextareaから値を抽出し、入力をURLエンコードしました。重要な点は、すべての特殊文字を自分で検索して置き換える必要がないことと、改行を保持してHTMLをエスケープすることです。シリアライズが機能するためには、入力フィールドにname属性が必要であり、エスケープされた文字列に同じ属性を追加する必要があります。あなたが探しているものではないかもしれませんが、それは私にとってはうまくいきます。
var myinputfield = jQuery("#myinputfield");
var text = myinputfield.serialize();
text = text.replace(myinputfield.attr('name') + '=','');
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内の値にのみ適用する場合もあります。
このアイデアが正しいことが判明した場合、すべてのレベルのプログラマーがこの問題を一度に解決できるように、簡単な例を作成できます。
正規表現を使用しないでください(つまり、まったく使用しないようにします)。最善かつ効果的な方法:
String.prototype.escapeJSON = function() {
var result = "";
for (var i = 0; i < this.length; i++)
{
var ch = this[i];
switch (ch)
{
case "\\": ch = "\\\\"; break;
case "\'": ch = "\\'"; break;
case "\"": ch = '\\"'; break;
case "\&": ch = "\\&"; break;
case "\t": ch = "\\t"; break;
case "\n": ch = "\\n"; break;
case "\r": ch = "\\r"; break;
case "\b": ch = "\\b"; break;
case "\f": ch = "\\f"; break;
case "\v": ch = "\\v"; break;
default: break;
}
result += ch;
}
return result;
};