ジャクソンのJSON文字列をJsonNodeに解析する方法は?


231

それはとても単純なはずですが、1時間#恥ずかしいことを試みた後、それを見つけることができません。

たとえば、JSON文字列をとして{"k1":v1,"k2":v2}解析する必要がありますJsonNode

JsonFactory factory = new JsonFactory();
JsonParser jp = factory.createJsonParser("{\"k1\":\"v1\"}");
JsonNode actualObj = jp.readValueAsTree();

与える

java.lang.IllegalStateException: No ObjectCodec defined for the parser, can not deserialize JSON into JsonNode tree


54
#embarrasing-いいえ。単純なことが単純ではない場合、あなたではなく、APIデザイナーが失敗しています。
jameshfisher 2014

コードでの@StaxManの回答:JsonFactory factory = new MappingJsonFactory();
ファンロハス

回答:


371

リチャーズのわずかなバリエーションが答えますがreadTree、文字列を取ることができるため、次のように簡略化できます。

ObjectMapper mapper = new ObjectMapper();
JsonNode actualObj = mapper.readTree("{\"k1\":\"v1\"}");

44
使用ObjectNodeではなくJsonNode使用を必要とするすべての人のためにmapper.valueToTree("{\"k1\":\"v1\"}")
マシュー・ハーブスト2015

5
@MatthewHerbst 2.5.1では、JSONとして解析するのではなく、文字列 "{\" k1 \ ":\" v1 \ "}"で新しいテキストノードを作成します。
minexew

69

を使用する必要がありますObjectMapper

ObjectMapper mapper = new ObjectMapper();
JsonFactory factory = mapper.getJsonFactory(); // since 2.1 use mapper.getFactory() instead
JsonParser jp = factory.createJsonParser("{\"k1\":\"v1\"}");
JsonNode actualObj = mapper.readTree(jp);

パーサーの作成に関する詳細なドキュメントはここにあります


JsonNodeを取得して少し変更してから、mapper.readValue(node、class);を呼び出すことは可能ですか。そして、クラスを出ますか?
portforwardpodcast 2012

1
はい。そのためのエイリアスもありmapper.treeToValue()ます。しかしreadValue()また働きます。
StaxMan 2013

リンクが壊れているようです
マナナ

28

3番目のバリアント:

ObjectMapper mapper = new ObjectMapper();
JsonNode actualObj = mapper.readValue("{\"k1\":\"v1\"}", JsonNode.class);

JsonNode.classを渡すことで実際に何が得られましたか?
デビッド

3
@David:何もないので、スラッシュニックのバリアントは、単にJsonNode。ただし、通常はは必要ないので、JsonNodeジャクソンにどのような種類の価値が必要かを伝える方法を示しました。
qerub 2013年

私にとっては、JsonNodeジャクソンが別の何かとして逆シリアル化するのを防ぐためにパスが明らかに必要でした-失敗したでしょう。
コリークライン

5

リチャードの答えは正しいです。あるいは、どこにあるかを知っているMappingJsonFactory(でorg.codehaus.jackson.map)を作成することもできますObjectMapper。定期的なので、あなたが得たエラーでしたJsonFactory(からのcoreパッケージが)への依存関係がありませんObjectMapper(であるmapperパッケージ)。

ただし、通常は使用するだけで、その他の低レベルのコンポーネントをObjectMapper気にする必要はありません。JsonParserこれらは、ストリームの一部をデータバインドしたり、低レベルの処理を実行したりする場合にのみ必要です。


3
import com.github.fge.jackson.JsonLoader;
JsonLoader.fromString("{\"k1\":\"v1\"}")
== JsonNode = {"k1":"v1"}

0

古い質問への新しいアプローチ。Java 9以降で機能するソリューション

ObjectNode agencyNode = new ObjectMapper().valueToTree(Map.of("key", "value"));

複雑なオブジェクトに対しては、より読みやすく、保守が容易です。Ej

Map<String, Object> agencyMap = Map.of(
        "name", "Agencia Prueba",
        "phone1", "1198788373",
        "address", "Larrea 45 e/ calligaris y paris",
        "number", 267,
        "enable", true,
        "location", Map.of("id", 54),
        "responsible", Set.of(Map.of("id", 405)),
        "sellers", List.of(Map.of("id", 605))
);
ObjectNode agencyNode = new ObjectMapper().valueToTree(agencyMap);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.