web-dev-qa-db-ja.com

JacksonでJSON文字列をJsonNodeに解析する方法

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

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

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

214
fadmaa

Richardsの回答には多少のバリエーションがありますが、readTreeは文字列を取ることができるので、以下のように単純化できます。

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

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

パーサーの作成に関するさらなる文書は ここ にあります。

68
Richard Fearn

第3の変種

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

リチャードの答えは正しいです。あるいは、MappingJsonFactoryを見つける場所を知っているObjectMapperorg.codehaus.jackson.map内)を作成することもできます。 (JsonFactoryパッケージからの)通常のcoreは(ObjectMapperパッケージ内にある)mapperに依存していないために発生したエラーです。

しかし、通常はObjectMapperを使用するだけで、JsonParserや他の低レベルのコンポーネントについて心配する必要はありません。ストリームの一部をデータバインドする場合、または低レベルの処理を行う場合にのみ必要です。

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