web-dev-qa-db-ja.com

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を自分のモデルに適用することになるでしょう

114
Alexandre

Jackson 2.4では、次のように変換できます。

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

ここで、jsonObjectMapperはJacksonのObjectMapperです。


ジャクソンの古いバージョンでは、

MyClass newJsonNode = jsonObjectMapper.readValue(someJsonNode, MyClass.class);
218
icedtrees

これはトリックを行う必要があります:

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);

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

8
Eric Barr

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);
4
mumrah
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_UNK‌​NOWN_PROPERTIES);
3
llambda