これは少し珍しいかもしれませんが、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
を自分のモデルに適用することになるでしょう
Jackson 2.4では、次のように変換できます。
MyClass newJsonNode = jsonObjectMapper.treeToValue(someJsonNode, MyClass.class);
ここで、jsonObjectMapper
はJacksonのObjectMapper
です。
ジャクソンの古いバージョンでは、
MyClass newJsonNode = jsonObjectMapper.readValue(someJsonNode, MyClass.class);
これはトリックを行う必要があります:
mapper.readValue(fileReader, MyClass.class);
私はそれをString
ではなくBufferedReader
で使用しているが、それでも動作するはずだからと言う。
これが私のコードです:
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から可能です。 ObjectMapper#readValue
を使用してJsonNodeをPOJOに変換できます: http://jackson.codehaus.org/1.9.4/javadoc/org/codehaus/jackson/map/ObjectMapper.html#readValue(org.codehaus.jackson .JsonNode 、Java.lang.Class)
ObjectMapper mapper = new ObjectMapper();
JsonParser jsonParser = mapper.getJsonFactory().createJsonParser("{\"foo\":\"bar\"}");
JsonNode tree = jsonParser.readValueAsTree();
// Do stuff to the tree
mapper.readValue(tree, Foo.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より多くのプロパティがあり、ジャクソン2.4の余分なものを無視したい場合、次のようにObjectMapperを設定できます。 この構文はジャクソンの古いバージョンとは異なります。(間違った構文を使用すると、何もしません。)
mapper.disable(com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);