JSONでの末尾カンマ RDB保存時には注意

本日は、JSONネタである。
JSONで配列を記述することができる。
こんな感じである。

var json_array = [1,2,3,4,5];

JavaScript ≒ Java ≒ C/C++
なので、C言語で配列を定義するのと同じ感じ。C言語では{}を使うけど。

int c_array[5] = {1,2,3,4,5};

JSONで良いところは、最後がカンマで終わっていても良いところ。配列要素が増えるということはよくあることなので、最後にカンマを書いておくと、変なSyntaxエラーに悩まされなくて済む。

var json_array = ['one',
'two',
'three',
'four',
'five',  // ここにカンマを書いていてもOK
];
var json_array = ['one',
'two',
'three',
'four',
'five',
'six',   // 上の'five'をコピってこの行を作れる。
];

C/C++でも余計にカンマ書いてもOK。

int c_array[5] = {1,
2,
3,
4,
5,
};

SQLでは最後にカンマがあるとSyntaxエラーになる。SELECT句でよくやってしまう間違い。

select one,
two,
three,
four,
five,
from number

って書くと悲しいかなエラーになってしまう。
列が増えることを念頭に「カンマを先に書く」というお作法もある。例えばこんな感じ。

select one
,two
,three
,four
,five
from number

これなら、,fiveをコピって,sixを作れる。

select one
,two
,three
,four
,five
,six
from number

でもなんか変。カンマは列名の後にきてないと違和感がある。最初のoneを改行するとさらに変になる。

select
one
,two
,three
,four
,five
from number

oneだけ浮いてる。
JSONはカンマ書いてあっても大丈夫なので、きれいに書ける。

var json_array = [
'one',
'two',
'three',
'four',
'five',
];

ほらね。
まぁ「カンマの位置なんてどうでもいいよ」という人にはどうでもいい話なのではあるが...
ただし、最後の余計なカンマは古いブラウザや正式なJSONではエラーになるので注意されたし。
RDBのJSON型に突っ込む場合もエラーになることもあるので注意。

ここは後で追加しそう。というところだけケツカンマ付けておくっていうのが無難。

正式なJSON

正式なJSONと聞いて「はて?」と思われた方もいるかと。
「正式な」というよりかは、「厳密な」と言った方が良いかも。
最後の余計なカンマを付けると、厳密にいうと正式なJSONデータにはならないので、JSON.parseできない。データベースのJSON型にも保存することができない。
Postgresでやってみると...

postgres# insert into foo values('[1,2,3,4,5,]')
ERROR: invalid input syntax for type json

ほら、怒られた。テーブルfooはJSON型の列をひとつだけ持っている。
エラーの原因はJSONのsyntaxエラーである。5の後のカンマね。それを取るとエラーにはならない。

postgres# insert into foo values('[1,2,3,4,5]')
INSERT 0 1

厳密に正しいJSONデータになるので、保存できる。
あと、連想配列のフィールド名(キー)となる部分は、"で囲む必要がある。上記の例は配列なので、でてきていないが、連想配列を保存させたい場合は注意しないといけない。

postgres# insert into foo values('{name:"asai",age:55}')
ERROR: invalid input syntax for type json
DETAIL: Token "name" is invalid.

nameはダメで、"name"としなければならない。同様に、ageも"age"にする。

postgres# insert into foo values('{"name":"asai","age":55}')
INSERT 0 1

ほらね。

投稿者プロフィール

asai
asai