4

引用符が含まれている JSON の解析で奇妙な小さな問題が発生しています。これを行うために、ネイティブの JSON.stringify および JSON.parse 関数を使用しています。引用符を含むオブジェクトを文字列化すると、期待どおりにエスケープされます。これを解析してオブジェクトに戻すと、再び正常に動作します。

問題は、文字列化してオブジェクトをページに出力し、結果の文字列を解析する場所で発生しています。これを行おうとすると、stringify が問題のある各引用符の前に単一のスラッシュしか置かないため、解析関数は失敗します。

これを達成する必要がある理由は、JSON 文字列としてデータベースに格納されたコンテンツを動的にロードするアプリケーションに取り組んでいるためです。JavaScriptが文字列を見つけて、その内容に基づいてページを構築できるように、ある時点で文字列をページのどこかに印刷する必要があります。ユーザーが間違った文字を入力しても失敗しないように、文字列との間でオブジェクトを確実に渡す方法が必要です!

今のところ、replace 呼び出しで余分なスラッシュをコードに挿入することでこれを解決できますが、これを処理するためのより良い方法があるかどうか疑問に思っていました。

私が説明しようとしていることを説明するために、いくつかの jsfiddles をまとめました。

http://jsfiddle.net/qwUAJ/ (文字列化して解析する)

var ob = {};
ob["number1"] = 'Number "1"';
ob["number2"] = 'Number 2';
ob["number3"] = 'Number 3';

var string = JSON.stringify(ob);
var reOb = JSON.parse('{"number1":"Number \"1\"","number2":"Number 2","number3":"Number 3"}');

$('div').html(string);

http://jsfiddle.net/a3gBf/4/ (文字列化して出力し、解析して戻す)

// Make an object
var ob = {};
ob["number1"] = 'Number "1"';
ob["number2"] = 'Number 2';
ob["number3"] = 'Number 3';

// Turn the object into a JSON string
var string = JSON.stringify(ob);

// Printing the string outputs
// {"number1":"Number \"1\"","number2":"Number 2","number3":"Number 3"}
$('.stringified').html(string);

// Attempt to turn the printed string back into an object
var reOb = JSON.parse('{"number1":"Number \"1\"","number2":"Number 2","number3":"Number 3"}');

// This fails due to the single escaped quote marks.

事前に助けてくれてありがとう!

4

2 に答える 2

7

これは、文字列を最初に文字列リテラルに変換せずに再評価することから生じる問題であるため、有効であっても意味が変わってしまいます。リテラルが実際に
何を意味するのかを考える必要がありますか? '\"'答えは"、なし\です。なんで?

  • \"に解決"

\"リテラルの結果として取得したい場合は、次のように書く必要があります'\\\"'

  • \\に解決\
  • \"に解決"

したがって、基本的に、文字列リテラルで特別な意味を持つ文字をエスケープするには、余分なスラッシュが必要です。

そうすれば、そのままでうまくいきますvar reOb = JSON.parse($('.stringified').html());


さらに検討する

str = '\\\"\\\'';      //      \"\'
str = '\"\'';          //      "'
str = '"'';            // SyntaxError: Unexpected token ILLEGAL

私の知る限り、JavaScriptは必要に応じて文字列を変換するためのネイティブ実装を提供していないため、私が知っている最も簡単な方法は、replace

function toLiteral(str) {
    var dict = {'\b': 'b', '\t': 't', '\n': 'n', '\v': 'v', '\f': 'f', '\r': 'r'};
    return str.replace(/([\\'"\b\t\n\v\f\r])/g, function ($0, $1) {
        return '\\' + (dict[$1] || $1);
    });
}
toLiteral('foo\\bar'); // "foo\\bar"
于 2013-08-16T12:56:42.787 に答える
2

PHP コードで JS を生成する場合は、JSON 文字列の引用符をエスケープする必要があります。

//PHP code generating js code
echo "var myJSONString = \"". str_replace("\"","\\\"",$mySqlJSON)."\";";
于 2013-08-16T13:14:04.967 に答える