32

Jackson JSON ライブラリを使い始めたばかりです。Jackson は非常に強力なライブラリですが、非常に広範な API を備えています。多くのことは複数の方法で行うことができます。これにより、ジャクソンで自分の道を見つけるのが難しくなります-正しい/最善の方法を知るにはどうすればよいですか?

このソリューションを使用する理由:

String json = "{\"a\":2, \"b\":\"a string\", \"c\": [6.7, 6, 5.6, 8.0]}";
ObjectMapper mapper = new ObjectMapper();
JsonNode node = mapper.readValue(json, JsonNode.class);
if (node.isObject()) {
    ObjectNode obj = mapper.convertValue(node, ObjectNode.class);
    if (obj.has("a")) {
        System.out.println("a=" + obj.get("a").asDouble());
    }
}

このようなソリューションについて:

String json = "{\"a\":2, \"b\":\"a string\", \"c\": [6.7, 6, 5.6, 8.0]}";
ObjectMapper mapper = new ObjectMapper();
JsonNode node = mapper.readTree(json);
if (node.isObject()) {
    ObjectNode obj = (ObjectNode) node;
    if (obj.has("a")) {
        System.out.println("a=" + obj.get("a").asDouble());
    }
}     

または、JsonFactory と JsonParser を使用して出くわしたソリューションと、さらに多くのオプションについて...

mapper.readValue は最も一般的であり、JsonNode、ObjectNode、ArrayNode、PoJo などへの読み取りなど、多くの場合に使用できるようです。では、なぜ mapper.readTree を使用するのでしょうか?

そして、JsonNode を ObjectNode に変換する最良の方法は何ですか? ObjectNode にキャストするだけですか? または mapper.convertValue のようなものを使用しますか?

4

2 に答える 2

13

読み取り値は、独自の Java クラスに使用できます。

public class Foo {
   private int a;
   private String b;
   private double[] c;

   // getters/setters
}

String json = "{\"a\":2, \"b\":\"a string\", \"c\": [6.7, 6, 5.6, 8.0]}";
ObjectMapper mapper = new ObjectMapper();
Foo foo = mapper.readValue(json, Foo.class);

つまりreadTree、オブジェクトの正確なタイプがわからない場合とreadValue、オブジェクト タイプが確実にわかっている場合を選択できます。

于 2012-04-11T21:16:55.627 に答える