改行を含んだJSON
Perl の JSON::Syckでデータに改行が含まれるオブジェクトを Dump すると、以下のような出力が得られる。
$ perl -de0
DB<1> use JSON::Syck
DB<2> $data = { foo => "xxx\nyyy" }
DB<3> p JSON::Syck::Dump($data)
{"foo":"xxx\n\
yyy"}読みやすくするためか、改行コードを \ でエスケープした形式。
JSON.pm だと改行コードは含まれない。
DB<4> use JSON
DB<5> p objToJson($data)
{"foo":"xxx\nyyy"}で、JSON::Syck が出力するデータは JavaScript の eval では parse できるが、json.org の json.js や、Jemplate(0.18) 附属の Jemplate.js (に含まれる JSON function) では parse できない。
サンプルコード。
test.js
{ "foo": "bar\n\
baz" }test.html
<script type="text/javascript" src="http://search.cpan.org/src/INGY/Jemplate-0.18/share/Jemplate.js"></script>
<script type="text/javascript" src="http://www.json.org/json.js"></script>
<script type="text/javascript">
var result = document.getElementById('result');
function useJemplate(){
Ajax.get(
'test.js',
function(r) { document.getElementById('result').innerHTML = JSON.parse(r) }
)
}
function useJsonJs(){
Ajax.get(
'test.js',
function(r) { document.getElementById('result').innerHTML = r.parseJSON() }
)
}
function useEval(){
Ajax.get(
'test.js',
function(r) { document.getElementById('result').innerHTML = eval('('+ r + ')') }
)
}
</script>
<a href="javascript:useJemplate()">use Jemplate</a><br>
<a href="javascript:useJsonJs()">use json.js</a><br>
<a href="javascript:useEval()">use eval</a><br>
<a href="test.js">test.js</a>
<div id="result" style="width: 100%; height: 300px;"></div>use eval をクリックすると object が得られているが、use Jemplate, use json.js はどちらも false. (というか、Jemplate.js 内の JSON function は json.js の古い版だ)
json.org のトップページでは以下のような記述があって。
char
any-Unicode-except-"-or-\-or-control
\"
\\
\/
\b
\f
\n
\r
\t
\u four-hex-digits これを読む限り、改行コードを \ でエスケープ、というのは正しくない形式のような……(JavaScript の eval ではたまたま読める、けど)
[追記] RTには登録済みでした