JavaでJSONをパースする場合、jacksonというライブラリが良く使われるかなっと勝手に思っています。
(なんでJavaにJSONを扱う標準ライブラリが無いんだ!?EE8のみ対応とか無くね?という愚痴はおいておいて)
このjacksonを使って、いわゆる「ケツカンマ」「末尾カンマ」とかいわれている書き方をしたJSONをparse出来るようにする方法について書きます。
正式リリースではないようです。
まず現時点(2017/6/22)でのjacksonの正式リリースは2.8系で、2.8系では末尾カンマには対応できないようです。
ALLOW_MISSING_VALUESというOptionで惜しいところまでできるようですが、いわゆる末尾カンマの対応とは言えません。
末尾カンマ(ケツカンマ・trailing comma)
ES5や、最近のJava(いつからか忘れた)では末尾カンマを無視するようになりましたね。
let obj = {
key1: 1,
key2: 2,
};
let arr = [
1,
2,
];
String[] ss = new String[] {
"a",
"b",
};
//・・・
enum KIND {
A,
B,
}
みたいな記述ができます。
(JSONの正式でどうなってるかはちゃんと調べていませんが)
通常のjacksonでのJSONパースで末尾カンマがあるとシンタックスエラーになりますが、
実はOptionとかで対応出来るんじゃないかと調べてみました。
jacksonの対応
下記のissueを見ると対応するようですね。
Add JsonParser.ALLOW_TRAILING_COMMA
to work for Arrays and Objects
ただ正式対応はまだな様子で、2.9.0.pr系を使うことで実現できるようです。
mavenならば、以下のように記述します。
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.0.pr4</version>
</dependency>
2.9.0系を使ったうえで、以下のようにObjectMapperのALLOW_TRAILING_COMMAという設定をすることで対応できるようです。
ObjectMapper mapper = new ObjectMapper().configure(JsonParser.Feature.ALLOW_TRAILING_COMMA, true);
Object obj = mapper.readValue(json, Object.class);
ケツカンマでググってもあまり出てこない。
個人的に「ケツカンマ」って呼んでたのですが、ググってもあまり出てこないですね。
日本語的には「末尾カンマ」なのでしょうか?ただ「jackson 末尾カンマ」でググってもこの対応方法は簡単に出てきませんでした。
最終的に「jackson trailing comma」でググったら出てきました。
「ケツカンマ」を調べるときは「trailing comma」でググること!というのが今回の個人的な教訓です。