2

この文字列をCookieに保存しています

"d967fac49ef2466239168bbbde0a8d755a27ba81$[[\"__json_message\"\05425\054\"This is a message.\"]]"

別名

"\"d967fac49ef2466239168bbbde0a8d755a27ba81$[[\\\"__json_message\\\"\\05425\\054\\\"This is a message.\\\"]]\""

(コンソールに貼り付けるため)

しかし、JSON.parseで解析できません。ただし、eval(これは悪です)で機能します。エラーはSyntaxError: Unexpected numberです。

注目すべきは、エスケープされたコンマです。これは、Django メッセージング API で生成されました。

代わりにこれを行うことができる優れた正規表現またはその他の手法を知っている人はいますか?

最初に文字列をエスケープ解除する必要があります (これは適切な JavaScript 文字列であるため)。次に、ドル( s.substring(s.indexOf("$")+1)) の後に配列が必要です。

4

1 に答える 1

3

不明な点があり申し訳ありませんが、jfriend00のjson.orgへのリンクのおかげでわかりました。以下は、機能する同等の文字列と、適切な出力が想定されているものです。これは、簡単にエスケープ解除する必要があった、すでにエンコードされた文字列内のJSON配列です。

var s = JSON.parse("\"d967fac49ef2466239168bbbde0a8d755a27ba81$[[\\\"__json_message\\\"\\u002C25\\u002C\\\"This is a message.\\\"]]\"")
// s = "d967fac49ef2466239168bbbde0a8d755a27ba81$[["__json_message",25,"This is a message."]]"
// and then I get what I actually want
var a = JSON.parse(s.substring(s.indexOf("$")+1))

問題は、文字列がCookie用に準備されたときに、コンマが8進数のエスケープコードに変換されたということでした。これはJSONでは許可されていません。エラーコードはであるはずJSON forbids octal prefixesです。それが処理されたら、それは大丈夫でしょう。したがって、8進数のエスケープコードを確認し、16進数のエスケープコードに置き換えます。


TL; DR: "SyntaxError:Unexpected Number"は、 "SyntaxError:JSONは8進数のプレフィックスを禁止する"を意味します


これが私が使った関数です

var s = "\"d967fac49ef2466239168bbbde0a8d755a27ba81$[[\\\"__json_message\\\"\\05425\\054\\\"This is a message.\\\"]]\""
var re = /\\0([0-7]{2})/g
JSON.parse(s.replace(re, function(m, n){return "\\x"+("0000"+parseInt(n,8).toString(16)).slice(-4)}))
于 2012-08-26T23:56:54.787 に答える