JSONの仕様は、フィールド名:キー は、(") ダブルクォーテーションで囲むと
されているが、RFC8259 にそんなこと書いてあるか?
JavaScript 表記のことを考えると、キーをダブルクォーテーションで囲まないケースで
読込みエラーになるのは、不都合なのではないか?
以下のように書いたJSON この時点でこれはJSONでないという方もいるだろうが、
{
id : 1207,
name : "Foo",
flg : true,
values : [ 11, 21, 34 ]
}
これを、Java Jackson で普通に読もうとすると、
com.fasterxml.jackson.core.JsonParseException: Unexpected character ('i' (code 105)):
was expecting double-quote to start field name
となる。
Jackson には、これを回避して読込む方法がある。
ObjectMapper のコンフィグレーションとして、JsonReadFeature.ALLOW_UNQUOTED_FIELD_NAMES を指定する。
ObjectMapper mapper = new ObjectMapper();
mapper.configure(JsonReadFeature.ALLOW_UNQUOTED_FIELD_NAMES.mappedFeature(), true);
Map<String, Object> map = mapper.readValue(jsontext, new TypeReference<LinkedHashMap<String, Object>>(){});
では、シングルクォーテーション文字で囲んだ場合はどうだろうか?
{
'id' : 1207,
'name' : "Foo",
'flg' : true,
'values' : [ 11, 21, 34 ]
}
この場合は、普通の ObjectMapper で読むと
com.fasterxml.jackson.core.JsonParseException: Unexpected character (''' (code 39)):
was expecting double-quote to start field name
と怒られる。
シングルクォーテーションで囲んだ場合を読み込ませるようにするには、、
JsonReadFeature.ALLOW_SINGLE_QUOTES を指定する。
ObjectMapper mapper = new ObjectMapper();
mapper.configure(JsonReadFeature.ALLOW_SINGLE_QUOTES.mappedFeature(), true);
Map<String, Object> map = mapper.readValue(jsontext, new TypeReference<LinkedHashMap<String, Object>>(){});
シングルクォーテーション、ダブルクォーテーション、
囲み文字無しの混在を検証する。
JsonReadFeature.ALLOW_UNQUOTED_FIELD_NAMES を指定した時、
double quote と quote無し が混在 |
OK |
double quote と single quote が混じっている |
NG |
JsonReadFeature.ALLOW_SINGLE_QUOTES を指定した時、
single quote と double quote が混じっている |
OK |
single quote と quote無し が混じっている |
NG |