2013-05-28 24 views
59

私はジャクソンにorg.jsonから私のJSONライブラリを変更していると私は、次のコードを移行したい:JsonNodeをキャストせずにArrayNodeに変換する方法

ジャクソンの今
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の可能性はありますか? getJSONArrayに相当するメソッドがorg.jsonにあるので、配列でない場合に適切なエラー処理ができますか?

+0

データが固定フィールド名ではないため、残念ながらフルマッピングを使用できません。 –

+1

フィールド名が限定されたものである場合は、それらのすべてを扱うクラスを定義し、デシリアライザの 'FAIL_ON_UNKNOWN_PROPERTIES'機能を使用して、未使用フィールドに返されたヌル値を取得するだけです。しかし、フィールド名セットが比較的限定されている場合は、もちろんオプションに過ぎません。 – fvu

+0

私はこのソリューションが私の場合には最適ではないと思いますが、事前に知られている限られたセットで問題が発生する場合に備えて覚えています! –

答えて

146

はい、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ライブラリと同じです)。

+1

時間を節約できました。ありがとう! –

1

org.jsonのgetJSONArrayと同等のメソッドがあり、配列でない場合に備えて適切なエラー処理ができますか?

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

しかし、もう一度、古いバージョンの正確さはの入力によって異なります。あなたの新しいバージョンがClassCastExceptionを投げる状況では、古いバージョンはJSONExceptionを投げます。参照:http://www.json.org/javadoc/org/json/JSONObject.html#getJSONArray(java.lang.String)

+0

ああ、私はClassCastExceptionを捕まえることができたので、ありがとう!私の好みでは、特定のJsonExceptionを持つよりもあまりエレガントではありませんが、そうでなければまだ良いです。 –

関連する問題