public interface JsonParser extends CloseableSE
クラス Json
には、入力ソース(InputStream
SE および Reader
SE)からパーサーを作成するためのメソッドが含まれています。
次の例は、空の JSON 配列を含む文字列からパーサーを作成する方法を示しています。
JsonParser parser = Json.createParser(new StringReader("[]"));
クラス JsonParserFactory
には、JsonParser
インスタンスを作成するためのメソッドも含まれています。複数のパーサーインスタンスを作成する場合は、JsonParserFactory
が推奨されます。次の例に使用例を示します。
JsonParserFactory factory = Json.createParserFactory();
JsonParser parser1 = factory.createParser(...);
JsonParser parser2 = factory.createParser(...);
JsonParser
は、プル解析プログラミングモデルを使用して JSON を解析します。このモデルでは、クライアントコードがスレッドを制御し、メソッド next()
を呼び出して、各要素の処理後にパーサーを次の状態に進めます。パーサーは次のイベントを生成できます: START_OBJECT
、END_OBJECT
、START_ARRAY
、END_ARRAY
、KEY_NAME
、VALUE_STRING
、VALUE_NUMBER
、VALUE_TRUE
、VALUE_FALSE
、VALUE_NULL
。
たとえば、空の JSON オブジェクト({})の場合、パーサーはメソッド next()
への最初の呼び出しでイベント START_OBJECT
を生成し、メソッド next()
への 2 番目の呼び出しでイベント END_OBJECT
を生成します。次のコードは、これらのイベントにアクセスする方法を示しています。
Event event = parser.next(); // START_OBJECT
event = parser.next(); // END_OBJECT
たとえば、次の JSON の場合:
{ "firstName": "John", "lastName": "Smith", "age": 25, "phoneNumber": [ { "type": "home", "number": "212 555-1234" }, { "type": "fax", "number": "646 555-4567" } ] }
メソッド next()
を呼び出すと、以下の指定された場所(太字でマークされている)で解析イベントが発生します。
{START_OBJECT "firstName"KEY_NAME: "John"VALUE_STRING, "lastName"KEY_NAME: "Smith"VALUE_STRING, "age"KEY_NAME: 25VALUE_NUMBER, "phoneNumber"KEY_NAME : [START_ARRAY {START_OBJECT "type"KEY_NAME: "home"VALUE_STRING, "number"KEY_NAME: "212 555-1234"VALUE_STRING }END_OBJECT, {START_OBJECT "type"KEY_NAME: "fax"VALUE_STRING, "number"KEY_NAME: "646 555-4567"VALUE_STRING }END_OBJECT ]END_ARRAY }END_OBJECTメソッド
next()
および hasNext()
を使用すると、パーサーイベントを反復して JSON データを処理できます。JsonParser
は、パーサーの現在の状態で値を取得する get メソッドを提供します。例: 次のコードは、上記の JSON から値 "John" を取得する方法を示しています。
Event event = parser.next(); // START_OBJECT
event = parser.next(); // KEY_NAME
event = parser.next(); // VALUE_STRING
parser.getString(); // "John"
バージョン 1.1 以降では、現在のパーサー位置で、ストリームから部分的な JSON オブジェクトモデルを構築できます。メソッド getArray()
および getObject()
を使用すると、JsonArray
または JsonObject
を読み込むことができます。例: 次のコードは、上記の JSON から JsonArray の phoneNumber を取得する方法を示しています。
while (parser.hasNext() {
Event event = parser.next();
if (event == JsonParser.Event.KEY_NAME ) {
String key = getString();
event = parser.next();
if (key.equals("phoneNumber") {
JsonArray phones = parser.getArray();
}
}
}
getArrayStream()
および getObjectStream()
メソッドは、JsonArray
または JsonObject
の要素のストリームを取得するために使用できます。例: 次のコードは、JsonArray
で John の phoneNumber を取得する別の方法を示しています。
Event event = parser.next(); // START_OBJECT
JsonArray phones = (JsonArray)
parser.getObjectStream().filter(e->e.getKey().equals("phoneNumber"))
.map(e->e.getValue())
.findFirst()
.get();
メソッド skipArray()
および skipObject()
を使用して、トークンをスキップし、パーサーを END_ARRAY
または END_OBJECT
に配置できます。JsonParser
は、JSON 配列に含まれていない一連の JSON 値を解析するために使用できます。{} {}。次のコードは、そのようなシーケンスを解析する方法を示しています。
JsonParser parser = Json.createParser(...);
while (parser.hasNext) {
parser.next(); // advance parser state
JsonValue value = parser.getValue();
}
Json
, JsonParserFactory
修飾子と型 | インターフェースと説明 |
---|---|
static class | JsonParser.Event JsonParser からのイベント。 |
修飾子と型 | メソッドと説明 |
---|---|
void | close() このパーサーを閉じ、パーサーに関連付けられているすべてのリソースを解放します。 |
default JsonArray | getArray() JsonArray を返し、対応する END_ARRAY にパーサーを進めます。 |
default StreamSE<JsonValue> | getArrayStream() JsonArray 要素のストリームを返します。 |
BigDecimalSE | getBigDecimal() JSON 番号を BigDecimal として返します。 |
int | getInt() JSON 番号を整数として返します。 |
JsonLocation | getLocation() JSON 入力ソース内のパーサーの現在の状態に対応する場所を返します。 |
long | getLong() JSON 番号を long として返します。 |
default JsonObject | getObject() JsonObject を返し、パーサーを対応する END_OBJECT に進めます。 |
default StreamSE<Map.EntrySE<StringSE, JsonValue>> | getObjectStream() JsonObject の名前と値のペアのストリームを返します。 |
StringSE | getString() 文字列値または数値の場合、名前 / 値ペアの名前の String を返します。 |
default JsonValue | getValue() 現在のパーサーの位置にある JsonValue を返します。 |
default StreamSE<JsonValue> | getValueStream() JSON 値のシーケンスから JsonValue のストリームを返します。 |
boolean | hasNext() さらに解析状態がある場合は、 true を返します。 |
boolean | isIntegralNumber() 現在のパーサー状態の JSON 番号が整数である場合、true を返します。 |
JsonParser.Event | next() 次の解析状態のイベントを返します。 |
default void | skipArray() パーサーを END_ARRAY に進めます。 |
default void | skipObject() パーサーを END_OBJECT に進めます。 |
boolean hasNext()
true
を返します。このメソッドは、パーサーが JSON テキストの最後に到達した場合に false
を返します。true
: 解析状態がさらにある場合。JsonException
- I/O エラーが発生した場合 (IOException は JsonException の原因となる)JsonParsingException
- パーサーが次の状態に進むときに無効な JSON を検出した場合。JsonParser.Event next()
JsonException
- I/O エラーが発生した場合 (IOException は JsonException の原因となる)JsonParsingException
- パーサーが次の状態に進むときに無効な JSON を検出した場合。NoSuchElementExceptionSE
- 解析状態がなくなった場合。StringSE getString()
String
を返します。このメソッドは、パーサーの状態が JsonParser.Event.KEY_NAME
、JsonParser.Event.VALUE_STRING
、JsonParser.Event.VALUE_NUMBER
の場合にのみ呼び出す必要があります。JsonParser.Event.KEY_NAME
である場合の名前パーサーの状態が JsonParser.Event.VALUE_STRING
である場合の文字列値パーサーの状態が JsonParser.Event.VALUE_NUMBER
である場合の数値 IllegalStateExceptionSE
- パーサーの状態が KEY_NAME
、VALUE_STRING
、VALUE_NUMBER
でない場合 boolean isIntegralNumber()
BigDecimal
SE を使用して値を内部的に格納することができ、このメソッドのセマンティクスは scale()
を使用して定義されます。スケールがゼロの場合、整数型と見なされます。次の例のように、この整数型情報を使用して、適切なアクセサーメソッドを呼び出して数値を取得できます。
JsonParser parser = ...
if (parser.isIntegralNumber()) {
parser.getInt(); // or other methods to get integral value
} else {
parser.getBigDecimal();
}
IllegalStateExceptionSE
- パーサーの状態が VALUE_NUMBER
ではない場合 int getInt()
new BigDecimal(getString()).intValue()
と同じです。この変換では、数値の全体的な大きさと精度に関する情報が失われ、反対の符号で結果が返される可能性があることに注意してください。このメソッドは、パーサーの状態が JsonParser.Event.VALUE_NUMBER
の場合にのみ呼び出す必要があります。IllegalStateExceptionSE
- パーサーの状態が VALUE_NUMBER
ではない場合 BigDecimal.intValue()
SElong getLong()
new BigDecimal(getString()).longValue()
と同じです。この変換では、数値の全体的な大きさと精度に関する情報が失われ、反対の符号で結果が返される可能性があることに注意してください。このメソッドは、パーサーの状態が JsonParser.Event.VALUE_NUMBER
の場合にのみ呼び出されます。IllegalStateExceptionSE
- パーサーの状態が VALUE_NUMBER
ではない場合 BigDecimal.longValue()
SEBigDecimalSE getBigDecimal()
BigDecimal
として返します。BigDecimal
は new BigDecimal(getString())
を使用して作成されます。このメソッドは、パーサーの状態が JsonParser.Event.VALUE_NUMBER
の場合にのみ呼び出す必要があります。BigDecimal
IllegalStateExceptionSE
- パーサーの状態が VALUE_NUMBER
ではない場合 JsonLocation getLocation()
default JsonObject getObject()
JsonObject
を返し、パーサーを対応する END_OBJECT
に進めます。JsonObject
IllegalStateExceptionSE
- パーサーの状態が START_OBJECT
ではない場合 default JsonValue getValue()
JsonValue
を返します。パーサーの状態が START_ARRAY
の場合、動作は getArray()
と同じです。パーサーの状態が START_OBJECT
の場合、動作は getObject()
と同じです。他のすべてのケースでは、該当する場合、JSON 値が読み取られて返されます。JsonValue
IllegalStateExceptionSE
- パーサーの状態が END_OBJECT
または END_ARRAY
の場合 default JsonArray getArray()
JsonArray
を返し、対応する END_ARRAY
にパーサーを進めます。JsonArray
IllegalStateExceptionSE
- パーサーの状態が START_ARRAY
ではない場合 default StreamSE<JsonValue> getArrayStream()
JsonArray
要素のストリームを返します。パーサーの状態は START_ARRAY
でなければなりません。要素は、ストリーム操作の必要に応じて、必要に応じて遅延して読み取られます。ストリーム操作がすべての配列要素を消費しない場合、skipArray
を使用して、未処理の配列要素をスキップできます。JsonArray
の要素のストリーム IllegalStateExceptionSE
- パーサーの状態が START_ARRAY
ではない場合 default StreamSE<Map.EntrySE<StringSE,JsonValue>> getObjectStream()
JsonObject
の名前と値のペアのストリームを返します。パーサーの状態は START_OBJECT
でなければなりません。名前と値のペアは、ストリーム操作の必要に応じて、必要に応じて遅延して読み取られます。ストリーム操作がオブジェクトの名前 / 値ペアのすべてを消費しない場合、skipObject
を使用して、未処理の要素をスキップできます。JsonObject
の名前 / 値ペアのストリーム IllegalStateExceptionSE
- パーサーの状態が START_OBJECT
ではない場合 default StreamSE<JsonValue> getValueStream()
JsonValue
のストリームを返します。値は、ストリーム操作の必要に応じて、必要に応じて遅延して読み取られます。JsonValue
のストリーム IllegalStateExceptionSE
- パーサーが配列またはオブジェクト内にある場合。default void skipArray()
END_ARRAY
に進めます。パーサーが配列コンテキストにある場合、つまり、対応する END_ARRAY
に遭遇することなく START_ARRAY
に以前に遭遇した場合、パーサーは対応する END_ARRAY
に進みます。パーサーが配列コンテキストにない場合、何も起こりません。default void skipObject()
END_OBJECT
に進めます。パーサーがオブジェクトコンテキスト内にある場合、つまり、対応する END_OBJECT
に遭遇することなく START_OBJECT
に以前に遭遇した場合、パーサーは対応する END_OBJECT
に進みます。パーサーがオブジェクトコンテキストにない場合、何も起こりません。void close()
AutoCloseableSE
の closeSE
CloseableSE
の closeSE
JsonException
- I/O エラーが発生した場合 (IOException は JsonException の原因となる)Copyright © 2018,2020 Eclipse Foundation.
Use is subject to license terms.