Perlを中心とした技術系の話などをつらつら

2006年05月23日

JSON::Syckで改行を含むデータをダンプすると改行の後にスペースが2個入る

Ajaxる時のサーバとのデータ交換フォーマットとして、JSONを使う時、perlでサーバ側を実装する際にはJSONとかJSON::Syckというモジュールを使うとperlのデータ構造をJSONフォーマットに変換してくれるので便利です。

昨日これを使って、サーバからデータを取得し、textareaに取得したデータを入れるということをしたところ、改行を含んだテキストだと、改行の後にスペースが2個入ってしまうという現象に遭遇しました。

要はこうなってほしいところが、

こうなってしまうんです。

調べてみると、クライアントで受け取ったJSONデータをevalした段階ですでにスペースを含んでいたので、サーバ側でJSONデータを作成するところに問題がありそうだということがわかりました。

そこで以下のようなスクリプトを書いて、JSON,JSON::SyckがどんなJSONデータを吐き出すか見てみました。

#!/usr/bin/env perl
use strict;
use JSON::Syck;
use JSON;
my $data = {
    key => "foo\nbar\nbaz\n"
};
print "# Dumped by JSON::Syck $JSON::Syck::VERSION:\n";
print JSON::Syck::Dump($data), "\n";
print "# Dumped by JSON $JSON::VERSION:\n";
print objToJson($data), "\n";

結果は以下のとおり。

# Dumped by JSON::Syck 0.12:
{"key":"foo\n\
  bar\n\
  baz\n"}
# Dumped by JSON 1.05:
{"key":"foo\nbar\nbaz\n"}

どうやらJSON::Syckを使ってダンプしたデータは、整形のため、改行の後に、スペースが2個入っているようです。それでこれをJavaScriptでevalするとこのスペースもデータとして含まれてしまうため、上記のような現象が起きたみたいです。

そもそも改行後にスペースが入ってしまうのが問題なのか、スペースが入るのは問題なくて、クライアント側のJavaScriptでのパースに問題があるのかわかってませんが、試した限りだと、IEとFirefoxでスペースつきのデータの扱い方が異なるようで、挙動が変わってしまい、困りました。

とりあえず、サーバ側で改行コードを[BR]とかに変換しておいて、クライアント側でそれを改行コードとか、<br />に変換するという風にして対処しましたが、ちょっと付け焼刃的ですかねー。

Technorati TAGTechnorati TAG , , , ,

Posted by horiuchi at 2006年05月23日 09:58

Continuing the discussion...

このエントリーのトラックバックURL:
http://hori-uchi.com/mt/trackback/438

このリストは、次のエントリーを参照しています: JSON::Syckで改行を含むデータをダンプすると改行の後にスペースが2個入る:

え、こんなバイトがあったの? 今だけ限定丸秘裏バイト公開中。あなたは、裏バイトを発見できるか?(サイトのどこにあるのか探してみてね☆)

続きを読む: 裏バイトな丸秘アルバイト

from 裏バイトなアルバイト情報 at 2006年06月10日 00:45

Comments

Post a comment




Remember personal info?