JacksonはJSONを処理するのに、次の3つの方法を提供しています。
Jacksonで必要とされるJARファイルは、その用途によって複数に分割されています。Streaming APIだけならば、
Tree ModelやData Bindingを用いるならば、
も必要となります。
JacksonDownload - FasterXML Wiki
なおJackson 2.2のJavadocは、それぞれ
jackson-core | https://fasterxml.github.io/jackson-core/javadoc/2.2.0/ |
jackson-databind | https://fasterxml.github.io/jackson-databind/javadoc/2.2.0/ |
jackson-annotations | https://fasterxml.github.io/jackson-annotations/javadoc/2.2.0/ |
にあります。
Streaming APIはデータを順に読み込みながら処理するため、最もパフォーマンスの良い方法ですが、特定の要素を取得するような用途には不向きです。
String data = "{\"a\":123,\"b\":true}"; JsonFactory factory = new JsonFactory(); try { JsonParser parser = factory.createParser(data); while (parser.nextToken() != JsonToken.END_OBJECT) { String name = parser.getCurrentName(); JsonToken token = parser.getCurrentToken(); System.out.println(name + ":" + token); } } catch (IOException e) { e.printStackTrace(); }
これを実行すると、
null:START_OBJECT a:FIELD_NAME a:VALUE_NUMBER_INT b:FIELD_NAME b:VALUE_TRUE
のように出力されます。
JsonToken (Jackson-core 2.2.0 API)public abstract JsonToken nextToken() throws IOException, JsonParseExceptionnextToken - JsonParser (Jackson-core 2.2.0 API)
Tree Modelでは、JSONデータにXML DOMのようにアクセスできます。
String data = "{\"a\":123,\"b\":true,\"c\":{}}"; ObjectMapper mapper = new ObjectMapper(); try { JsonNode rootNode = mapper.readTree(data); // 方法1:オブジェクトのフィールドを直接取得 for (JsonNode node : rootNode) { System.out.println(node); } // 方法2:オブジェクトのフィールド名からフィールドを取得 Iterator<String> fieldNames = rootNode.fieldNames(); while (fieldNames.hasNext()) { String name = fieldNames.next(); String value = rootNode.path(name).toString(); System.out.println(name + ":" + value); } } catch (JsonProcessingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }
これを実行すると、
123 true {} a:123 b:true c:{}
のように出力されます。
ノードの探索には、次の3つのメソッドがあります。基本的に、オブジェクトはその名前を文字列 (String) で指定し、配列はその要素の番号を数値 (int) で指定してアクセスします。
public abstract JsonNode path(String fieldName)path - JsonNode (jackson-databind 2.2.0 API)
public abstract JsonNode path(int index)
path()に似ていますが、ノードが存在しなかったときにはnullを返します。
public JsonNode get(String fieldName)get - JsonNode (jackson-databind 2.2.0 API)
public abstract JsonNode get(int index)
path(String)に似ていますが、ノードが存在しなかったときにMissingNodeを返す代わりに、そのノードを生成しオブジェクトに追加します。このメソッドはオブジェクト ノードに対してのみ使用でき、それ以外ではUnsupportedOperationException例外が発生します。
public JsonNode with(String propertyName)
オブジェクトの場合は、
String data = "{\"a\":123,\"b\":true,\"c\":{}}"; ObjectMapper mapper = new ObjectMapper(); try { JsonNode rootNode = mapper.readTree(data); JsonNode p1 = rootNode.path("a"); // IntNode JsonNode p2 = rootNode.path("b"); // BooleanNode JsonNode p3 = rootNode.path("c"); // ObjectNode JsonNode p4 = rootNode.path("d"); // MissingNode JsonNode g1 = rootNode.get("a"); // IntNode JsonNode g2 = rootNode.get("b"); // BooleanNode JsonNode g3 = rootNode.get("c"); // ObjectNode JsonNode g4 = rootNode.get("d"); // null // JsonNode w1 = rootNode.with("a"); // ERROR : UnsupportedOperationException: Property 'a' has value that is not of type ObjectNode // JsonNode w2 = rootNode.with("b"); // ERROR : UnsupportedOperationException: Property 'b' has value that is not of type ObjectNode JsonNode w3 = rootNode.with("c"); // ObjectNode JsonNode w4 = rootNode.with("d"); // ObjectNode } catch (JsonProcessingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }
配列の場合は、
String data = "[1,\"ABC\",{}]"; ObjectMapper mapper = new ObjectMapper(); JsonNode rootNode = mapper.readTree(data); JsonNode p1 = rootNode.path(0); // IntNode JsonNode p2 = rootNode.path(1); // TextNode JsonNode p3 = rootNode.path(2); // ObjectNode JsonNode p4 = rootNode.path(3); // MissingNode JsonNode g1 = rootNode.get(0); // IntNode JsonNode g2 = rootNode.get(1); // TextNode JsonNode g3 = rootNode.get(2); // ObjectNode JsonNode g4 = rootNode.get(3); // null
Data Bindingでは、JSONデータをJavaのデータ型と相互に変換できます。
String data = "{\"a\":123,\"b\":true,\"c\":{}}"; ObjectMapper mapper = new ObjectMapper(); try { Map<?, ?> rootNode = mapper.readValue(data, Map.class); System.out.println(rootNode.get("a")); // 123 System.out.println(rootNode.get("b")); // true System.out.println(rootNode.get("c")); // {} System.out.println(rootNode.get("d")); // null } catch (JsonParseException e) { e.printStackTrace(); } catch (JsonMappingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }
public <T> T readValue(byte[] src, Class<T> valueType) throws IOException, JsonParseException, JsonMappingExceptionreadValue - ObjectMapper (jackson-databind 2.2.0 API)