1. ホーム
  2. java

[解決済み] Jackson JsonNodeをArrayNodeにキャストせずに変換する方法は?

2022-05-31 21:41:18

質問

JSONライブラリをorg.jsonからJacksonに変更するので、以下のコードをマイグレートしたいです。

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

今度はJacksonで以下のようになりました。

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

しかし、私はそこのキャストが好きではありません。 ClassCastException ? に相当するメソッドはありますか? getJSONArrayorg.json で、配列でない場合に適切なエラーハンドリングをするようにできますか?

どのように解決するのですか?

はい、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);
    }
}

出力します。

"ワン"。

"ツー"

"スリー"

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