2016-03-20 7 views
1

私はAPIの出力を解析しています。解析ロジックを可能な限り一般的なものにしたいと思います。多くのapi呼び出しは共通のラッパー内のオブジェクトを返します。応答はこのような何かを見て:この応答ではjackson JsonNodeで未知のキー名を越えてナビゲートする方法はありますか?

{ 
    "success": true, 
    "data": { 
     "object_type": { 
      "object_id": { /* actual object data */ } 
     } 
    } 
} 

を、object_typeは、いくつかの異なる文字列のいずれかになります。オブジェクトで取得するには、この文字列とidフィールドをスキップする方法は

private static ObjectMapper MAPPER = new ObjectMapper(); 

<T> APIResponse<T> parseResponse(String input, Class<T> clazz) { 
    JsonNode node = MAPPER.readTree(input); 
    boolean success = node.path("success").asBoolean(true); 

    // This is what I'd like to be able to do but I can't seem to 
    // find anything like it 
    JsonNode objectNode = node.path("data").unwrap().firstValue(); 

    T object = MAPPER.treeToValue(objectNode, clazz); 
    return APIResponse.of(success, object); 
} 

あります:私は、内部オブジェクトのクラス参照を取り込み、これらの応答を処理するための関数を書いていますか?私はJsonNodeの.elementsを呼び出して最初のものを取り出せることは知っていますが、より簡単な方法がありますか?

答えて

1

JsonNode javdocを調べ、私は次のsnipetに付属している:()を2回反復子を呼び出すことによって、簡潔にするため、このコード犠牲性能:

JsonNode data = node.path("data"); 
if (!data.isMissingNode()) { // checks if data exists 
    if (data.iterator().hasNext()) { // checks if data is not empty 
     // get first child ("unwrap") 
     JsonNode firstNodeInsideData = data.iterator().next(); 
    } 
} 

は、ツリー内
ノートをより深く得るために、同じトリックを使用することができます。もちろんイテレータを変数に保存するように修正することはできます。

+0

ありがとう、私はそれを行う唯一の方法だと思います。 –

関連する問題