java - 追加 - Jackson は、キャスティングせずに配列ノードにJsonNodeを変換する方法?




jsonnodeクラス (2)

私はJSONライブラリをorg.jsonからJacksonに変更しています。次のコードを移行します:

JSONObject datasets = readJSON(new URL(DATASETS));
JSONArray datasetArray =  datasets.getJSONArray("datasets");

今ジャクソンには次のものがあります:

ObjectMapper m = new ObjectMapper();
JsonNode datasets = m.readTree(new URL(DATASETS));      
ArrayNode datasetArray = (ArrayNode)datasets.get("datasets");

しかし、私はそこにキャストが好きではない、 ClassCastException可能性はありClassCastExceptionか? org.json getJSONArrayに相当するメソッドがあるので、配列でない場合に適切なエラー処理ができますか?

https://code.i-harness.com


org.jsonのgetJSONArrayに相当するメソッドがあるので、配列でない場合に適切なエラー処理ができますか?

あなたの入力によって異なります。 つまり、URLから取得するものです。 "datasets"属性の値がプレーンな配列ではなく連想配列の場合、 ClassCastException

しかし、もう一度、古いバージョンの正しさは入力に依存します。 新しいバージョンでClassCastExceptionスローされる状況では、古いバージョンはJSONExceptionをスローしJSONException 。 リファレンス: http://www.json.org/javadoc/org/json/JSONObject.html#getJSONArray(java.lang.String) : http://www.json.org/javadoc/org/json/JSONObject.html#getJSONArray(java.lang.String)


はい、Jacksonマニュアルパーサのデザインは他のライブラリとはまったく異なります。 特に、 JsonNodeは、通常、他のAPIの配列ノードと関連付ける機能のほとんどがあります。 したがって、使用するにはArrayNodeにキャストする必要はありません。 ここに例があります:

JSON:

{
    "objects" : ["One", "Two", "Three"]
}

コード:

final String json = "{\"objects\" : [\"One\", \"Two\", \"Three\"]}";

final JsonNode arrNode = new ObjectMapper().readTree(json).get("objects");
if (arrNode.isArray()) {
    for (final JsonNode objNode : arrNode) {
        System.out.println(objNode);
    }
}

出力:

"1"
"二"
"三"

isArrayを使用して、 isArrayする前にノードが実際に配列であることを確認してください。 あなたのデータ構造に絶対に自信がある場合はチェックは必要ありませんが、必要に応じて利用できます(他のほとんどのJSONライブラリと同じです)。





jackson