2016-06-23 4 views
10

ジャクソンのObjectMapperをJSONツリー内の特定のノード(および 'down')からアンマーシャリングすることはできますか?ジャクソンを使用してJSONツリー内の特定のノードからオブジェクトをマップする

ユースケースは、拡張可能なドキュメント形式です。私はツリーを歩き、現在のパスを拡張可能なプラグインのセットに公開して、ユーザーが使用しているかどうか、そしてドキュメントのその部分で何をすべきかを知っているプラ​​グインを見たいと思っています。

私は、プラグインの作者がJsonNodeやストリーミングAPIの低レベルの詳細を処理する必要がないようにしたいと思います。代わりにいくつかのコンテキストと特定のJsonNodeを渡してから、素敵で便利なObjectMapperを使用して、ツリーのルートとして渡されたノードを考慮して、そのクラスのインスタンスを非整列化することができます。

+1

http://martinfowler.com/articles/refactoring-document-load.html#CreatingObjectsDeepInTheDocumentStructure –

答えて

13

次JSONを考えてみましょう:

{ 
    "firstName": "John", 
    "lastName": "Doe", 
    "address": { 
    "street": "21 2nd Street", 
    "city": "New York", 
    "postalCode": "10021-3100", 
    "coordinates": { 
     "latitude": 40.7250387, 
     "longitude": -73.9932568 
    } 
    } 
} 

そして、あなたは、次のJavaクラスへのcoordinatesノード解析したい考えてみます。これを行うには

public class Coordinates { 

    private Double latitude; 

    private Double longitude; 

    // Default constructor, getters and setters omitted 
} 

を、に全体JSONをパースJsonNodeObjectMapper

String json = "{\"firstName\":\"John\",\"lastName\":\"Doe\",\"address\":{\"street\":" 
      + "\"21 2nd Street\",\"city\":\"New York\",\"postalCode\":\"10021-3100\"," 
      + "\"coordinates\":{\"latitude\":40.7250387,\"longitude\":-73.9932568}}}"; 

ObjectMapper mapper = new ObjectMapper(); 
JsonNode node = mapper.readTree(json); 
coordinates

次にノードを照会しCoordinatesクラスにそれを解析するObjectMapperを使用するJSON Pointerを使用:

JsonNode coordinatesNode = node.at("/address/coordinates"); 
Coordinates coordinates = mapper.treeToValue(coordinatesNode, Coordinates.class); 

JSONポインタJSONを横断するパス言語です。詳細については、RFC 6901をご確認ください。バージョン2.3以来、Jacksonで利用可能です。

+1

これはちょうど私が後にしたものです!私はそれを実装するチャンスがあったら賞金を授与します。 –

+0

私は 'node.get(" address ")'はこの場合より簡単で効率的だと言います。 – shmosel

+1

@shmoselもちろんです。しかしここでのポイントは、ノードを照会するために使用できるJSONパスです。例として提供したJSONはとてもシンプルなので、JSON Pathを使用する利点はありません。 –

関連する問題