これは少し珍しいかもしれませんが、私は JsonNode
を POJO
に変換/マッピングする効率的な方法を探しています。
私はモデルの情報を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);
これなら大丈夫でしょう:
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);
または、設定するプロパティが見つからないというエラーが出ます。
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) を使ってください。
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_UNKNOWN_PROPERTIES);