Jakarta EE 10 - Jakarta JSON Processing 2.1 変更内容まとめ

blog1.mammb.com


はじめに

Jakarta EE 10 で 2.0 から 2.1 へバージョンアップする Jakarta JSON Processing の変更点のまとめです。

特に大きな変更内容は含まれていません。


APIとAPI実装でプロジェクトが分離された

Jakarta Mail などと同様に、API(およびTCK)とAPIの実装にプロジェクトが分離されました。

APIの実装は、JSON Binding の Eclipse Yasson に対して、Eclipse Parsson になりました。


java.lang.Number から JsonValue を取得するAPI追加

Jsonjava.lang.Number を引数に JsonNumber を取得するメソッドが追加されました。

public static JsonNumber createValue(Number value) {
    return JsonProvider.provider().createValue(value);
}


JsonParser から最後のイベントを取得可能となった

JsonParser に最後にスローされたイベントを再取得するメソッドが追加されました。

JsonParser に以下のメソッドが追加されています。

/**
 * Returns the event for the current parsing state.
 * @return the event for the current parsing state
 * @since 2.1
 */
default public Event currentEvent() {
    throw new UnsupportedOperationException();
}


キー重複時の処理を設定可能となった

重複したキーを処理するための標準プロパティが定義されました。

public final class JsonConfig {
    public static final String KEY_STRATEGY = "jakarta.json.JsonConfig.keyStrategy" ;

    public static enum KeyStrategy {
        /** Configuration value that will take the value of the first match. */
        FIRST,
        /** Configuration value that will take the value of the last match. */
        LAST,
        /** Configuration value that will throw {@link JsonException} when duplicate key is found. */
        NONE;
    }
}

以下のように使うことになるでしょう。

Map<String, Object> config = new HashMap<>();
config.put(jakarta.json.JsonConfig.KEY_STRATEGY, jakarta.json.JsonConfig.KeyStrategy.LAST);
JsonReaderFactory factory = Json.createReaderFactory(config);


JsonObjectBuilder メソッドの型境界の訂正

Json#createObjectBuilder() の型引数が訂正されました。

以下のように実用性のなかったものが、

public static JsonObjectBuilder createObjectBuilder(Map<String, Object> map) {
    return JsonProvider.provider().createObjectBuilder(map);
}

以下のように変更されました。

public static JsonObjectBuilder createObjectBuilder(Map<String, ?> map) {
    return JsonProvider.provider().createObjectBuilder(map);
}


仕様の明確化

JsonObjectBuilder.build() メソッドの挙動の明確化

JsonObjectBuilder#build メソッドが builder をクリアすることが明確化されました。

JSON Processing の仕様は JavaDoc なので、JavaDoc に明示されたということになります。

JsonGenerator#close メソッドの挙動の明確化

以下がJavaDocに明示されました。

完全な JSON オブジェクトが書き込まれた場合のみ、基礎となるストリームは閉じられる。 不完全なオブジェクトの場合、JsonGenerationException がスローされ、基礎となるストリームはクローズされません。

JsonParser メソッドの挙動の明確化

JsonParser のメソッド、 getObject(), getValue() , getArray() はパーサーの状態を進めるため、 JavaDocに以下の @throws が明記されました。

/**
 * ...
 * @throws jakarta.json.JsonException if an i/o error occurs (IOException would be cause of JsonException)
 * @throws JsonParsingException if the parser encounters invalid JSON when advancing to next state.
 * @throws java.util.NoSuchElementException if there are no more parsing states.
 */