JsonNodeをPOJOに変換する。

これは少し珍しいかもしれませんが、私は JsonNodePOJO に変換/マッピングする効率的な方法を探しています。

私はモデルの情報をjsonファイルに保存しており、モデルのいくつかのバージョンをサポートする必要があります。

私が行っているのは、JsonNodeでjsonファイルをメモリ上にロードし、いくつかのバージョニング戦略を適用して、それをモデルの最新バージョンに一致させることです。

    ObjectMapper mapper = new ObjectMapper();
    BufferedReader fileReader = new BufferedReader(new FileReader(projPath));

    JsonNode rootNode = mapper.readTree(fileReader);

    //Upgrade our file in memory
    applyVersioningStrategy(rootNode);

    ProjectModel project = mapJsonNodeToProject(rootNode);

もっと早くできる方法がない限り、結局は手動で JsonNodes を Model に適用することになるでしょう。

ソリューション

ジャクソン2.4では、次のように変換できます。

MyClass newJsonNode = jsonObjectMapper.treeToValue(someJsonNode, MyClass.class);

ここで、「jsonObjectMapper」はジャクソンの「ObjectMapper」です。

---。

ジャクソンの古いバージョンでは、そうなります。

MyClass newJsonNode = jsonObjectMapper.readValue(someJsonNode, MyClass.class);
解説 (6)

これなら大丈夫でしょう:

mapper.readValue(fileReader, MyClass.class);

バッファードリーダーではなく、文字列で使用しているため、そのような表現になりましたが、それでも動作するはずです。

以下は私のコードです:

String inputString = // I grab my string here
MySessionClass sessionObject;
try {
    ObjectMapper objectMapper = new ObjectMapper();
    sessionObject = objectMapper.readValue(inputString, MySessionClass.class);

以下は、その呼び出しに関する公式ドキュメントです:http://jackson.codehaus.org/1.7.9/javadoc/org/codehaus/jackson/map/ObjectMapper.html#readValue(java.lang.String, java.lang.Class) です。

また、ObjectMapperをインスタンス化する際に、カスタムデシリアライザを定義することもできる: http://wiki.fasterxml.com/JacksonHowToCustomDeserializers

編集する: もう一つ思い出したことがあります。入力されたオブジェクトが POJO が持つ以上のプロパティを持ち、余分なものを無視したい場合は、これを設定する必要があります:

    objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);

または、設定するプロパティが見つからないというエラーが出ます。

解説 (4)

org.codehaus.jacksonを使用している場合、1.6から可能になっています。JsonNodeをPOJOに変換するには、 ObjectMapper#readValue: http://jackson.codehaus.org/1.9.4/javadoc/org/codehaus/jackson/map/ObjectMapper.html#readValue(org.codehaus.jackson.JsonNode, java.lang.Class) を使ってください。

解説 (3)
String jsonInput = "{ \"hi\": \"Assume this is the JSON\"} ";
com.fasterxml.jackson.databind.ObjectMapper mapper =
    new com.fasterxml.jackson.databind.ObjectMapper();
MyClass myObject = objectMapper.readValue(jsonInput, MyClass.class);

JSON入力がPOJOの持つプロパティよりも多く、Jackson 2.4の余分なものを無視したい場合、ObjectMapperを次のように設定することができます。**この構文は、古いJacksonのバージョンとは異なっています。

mapper.disable(com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNK‌​NOWN_PROPERTIES);
解説 (0)