GreaseMonkey で JSON の扱いに関する問題

GreaseMonkey (Firefox) の場合、[cci_JavaScript]object.toSource()[/cci] でオブジェクトをシリアライズでき、[cci_JavaScript]GM_setValue()[/cci], [cci_JavaScript]GM_getValue()[/cci] を使って永続しています。
これはこれで問題がなかったんですが、[cci_JavaScript]object.toSource()[/cci] をシリアライズではなく、JSON 形式と誤認して PHP と組み合わせた結果、色々と問題を起こしました。

楽しようと思って使った JSON でかなりハマったので、メモしておきます。

まずはじめは、magic_quotes_gpc の問題。
「[cci]”[/cci]」などがエスケープされるのですが、どのタイミングでどこでこの処理が行なわれているか分からず、結局、[cci_php]$_POST[/cci] で受け取った後に正規表現で置換して復元していました。

次にハマったのが、[cci_JavaScript]object.toSource()[/cci] で得られた結果は、PHP の [cci_php]json_decode()[/cci] を使って値を読み込むことができない(ことも多々ある)点。

たとえば、[cci_javascript]{id:1}[/cci] は JavaScript 的には OK ですが、JSON 的には NG で、[cci_javascript]{“id”:1}[/cci] という風に「[cci]”[/cci]」で [cci]id[/cci] が括られていないと [cci_php]json_decode()[/cci] に失敗します。

そのため、これも正規表現で置換処理していました。

しかし、どうしても上手く処理できないデータがあるので追跡して見たところ、ウムラウトが含まれる場合 [cci_php]json_decode()[/cci] に失敗していることが分かりました。

[cci_javascript]([“München”]).toSource()[/cci] は、[cci_javascript][“M\xFCnchen”][/cci] を返しますが、 [cci_php]json_decode(‘[“M\xFCnchen”]’)[/cci] は [cci_php]NULL[/cci] が返りデコードできません。

ここにきて、[cci_JavaScript]object.toSource()[/cci] の戻り値を JSON 形式として扱おうとしていることに根本的な問題があることが分かりました。

対策としては、PHP の側を Firefox に合わせる(要するに、[cci_JavaScript]object.toSource()[/cci] の戻り値を PHP で利用できるようにする)か、あるいは、ちゃんとした JSON 形式でデータを送受信するか、このどちらかなので、後者を選択しました。
# 厳密にいえば、JSON ではなくて、xml でやるとかもあるんですけど。

正しい方法か分からないのですが、jQuery JSON から必要な部分だけを切り出して、GreaseMonkey スクリプトに貼り付けて解決しました。

通りすがりのお方から、[cci_JavaScript]JSON.stringify()[/cci] を教えていただきました。ありがとうございます。

ということで、まとめ。

  1. [cci_php]magic_quotes_gpc[/cci] は切る
  2. [cci_JavaScript]toSource()[/cci] ではなく、[cci_JavaScript]JSON.stringify()[/cci] を使う
にほんブログ村 ライフスタイルブログ 薪ストーブ暮らしへ
にほんブログ村 ライフスタイルブログ 薪ストーブ暮らしに参加しています。 励みになりますので、足あとがわりに、ランクアップにご協力下さい。

2 thoughts on “GreaseMonkey で JSON の扱いに関する問題

  1. 通りすがりのお方、ありがとうございます。

    JSON.stringify() ですね。ググりました。
    GIHYO の記事で、toSource() を使っていたので、参考にしたんですが、見たものがよくなかったようです。
    eval の問題もないし、Firefox 限定なので、JSON.stringify() に置き換えたいと思います。

Leave a Reply