ジャクソン–ツリーモデルの例
Jacksonでは、Tree Model
を使用してJSON構造を表し、XML DOMツリーと同様にJsonNode
を介してCRUD操作を実行できます。 このJacksonTree Model
は、特にJSON構造がJavaクラスに適切にマップされない場合に役立ちます。
pom.xml
com.fasterxml.jackson.core jackson-databind 2.9.8
P.S Tested with Jackson 2.9.8
1. JSONのトラバース
1.1 Jackson TreeModel
example to traversing below JSON file:
C:\projects\user.json
{ "id": 1, "name": { "first": "Yong", "last": "Mook Kim" }, "contact": [ { "type": "phone/home", "ref": "111-111-1234" }, { "type": "phone/work", "ref": "222-222-2222" } ] }
1.2 Process JsonNode
one by one.
JacksonTreeModelExample1.java
package com.example; import com.fasterxml.jackson.core.JsonGenerationException; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import java.io.File; import java.io.IOException; public class JacksonTreeModelExample1 { private static final ObjectMapper mapper = new ObjectMapper(); public static void main(String[] args) { try { JsonNode root = mapper.readTree(new File("c:\\projects\\user.json")); // Get id long id = root.path("id").asLong(); System.out.println("id : " + id); // Get Name JsonNode nameNode = root.path("name"); if (!nameNode.isMissingNode()) { // if "name" node is exist System.out.println("firstName : " + nameNode.path("first").asText()); System.out.println("middleName : " + nameNode.path("middle").asText()); System.out.println("lastName : " + nameNode.path("last").asText()); } // Get Contact JsonNode contactNode = root.path("contact"); if (contactNode.isArray()) { System.out.println("Is this node an Array? " + contactNode.isArray()); for (JsonNode node : contactNode) { String type = node.path("type").asText(); String ref = node.path("ref").asText(); System.out.println("type : " + type); System.out.println("ref : " + ref); } } } catch (JsonGenerationException e) { e.printStackTrace(); } catch (JsonMappingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
出力
id : 1 firstName : Yong middleName : lastName : Mook Kim Is this node an Array? true type : phone/home ref : 111-111-1234 type : phone/work ref : 222-222-2222
2. JSON配列のトラバース
2.1 JSON file, top level represents an Array.
c:\projects\user2.json
[ { "id": 1, "name": { "first": "Yong", "last": "Mook Kim" }, "contact": [ { "type": "phone/home", "ref": "111-111-1234" }, { "type": "phone/work", "ref": "222-222-2222" } ] }, { "id": 2, "name": { "first": "Yong", "last": "Zi Lap" }, "contact": [ { "type": "phone/home", "ref": "333-333-1234" }, { "type": "phone/work", "ref": "444-444-4444" } ] } ]
2.2 The concept is same, just loop the JSON array :
JsonNode rootArray = mapper.readTree(new File("c:\\projects\\user2.json")); for (JsonNode root : rootArray) { // get node like the above example 1 }
JacksonTreeModelExample2.java
package com.example; import com.fasterxml.jackson.core.JsonGenerationException; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import java.io.File; import java.io.IOException; public class JacksonTreeModelExample2 { private static final ObjectMapper mapper = new ObjectMapper(); public static void main(String[] args) { try { JsonNode rootArray = mapper.readTree(new File("c:\\projects\\user2.json")); for (JsonNode root : rootArray) { // Get id long id = root.path("id").asLong(); System.out.println("id : " + id); // Get Name JsonNode nameNode = root.path("name"); if (!nameNode.isMissingNode()) { // if "name" node is exist System.out.println("firstName : " + nameNode.path("first").asText()); System.out.println("middleName : " + nameNode.path("middle").asText()); System.out.println("lastName : " + nameNode.path("last").asText()); } // Get Contact JsonNode contactNode = root.path("contact"); if (contactNode.isArray()) { System.out.println("Is this node an Array? " + contactNode.isArray()); for (JsonNode node : contactNode) { String type = node.path("type").asText(); String ref = node.path("ref").asText(); System.out.println("type : " + type); System.out.println("ref : " + ref); } } } } catch (JsonGenerationException e) { e.printStackTrace(); } catch (JsonMappingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
出力
id : 1 firstName : Yong middleName : lastName : Mook Kim Is this node an Array? true type : phone/home ref : 111-111-1234 type : phone/work ref : 222-222-2222 id : 2 firstName : Yong middleName : lastName : Zi Lap Is this node an Array? true type : phone/home ref : 333-333-1234 type : phone/work ref : 444-444-4444
3. ツリーモデルCRUDの例
3.1 This example, show you how to create, update and remove JSON nodes, to modify JSON node, we need to convert it to ObjectNode
. 自明のコメントを読んでください。
JacksonTreeModelExample3.java
package com.example; import com.fasterxml.jackson.core.JsonGenerationException; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ObjectNode; import java.io.File; import java.io.IOException; public class JacksonTreeModelExample3 { private static final ObjectMapper mapper = new ObjectMapper(); public static void main(String[] args) { try { JsonNode root = mapper.readTree(new File("c:\\projects\\user.json")); String resultOriginal = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(root); System.out.println("Before Update " + resultOriginal); // 1. Update id to 1000 ((ObjectNode) root).put("id", 1000L); // 2. If middle name is empty , update to M ObjectNode nameNode = (ObjectNode) root.path("name"); if ("".equals(nameNode.path("middle").asText())) { nameNode.put("middle", "M"); } // 3. Create a new field in nameNode nameNode.put("nickname", "example"); // 4. Remove last field in nameNode nameNode.remove("last"); // 5. Create a new ObjectNode and add to root ObjectNode positionNode = mapper.createObjectNode(); positionNode.put("name", "Developer"); positionNode.put("years", 10); ((ObjectNode) root).set("position", positionNode); // 6. Create a new ArrayNode and add to root ArrayNode gamesNode = mapper.createArrayNode(); ObjectNode game1 = mapper.createObjectNode().objectNode(); game1.put("name", "Fall Out 4"); game1.put("price", 49.9); ObjectNode game2 = mapper.createObjectNode().objectNode(); game2.put("name", "Dark Soul 3"); game2.put("price", 59.9); gamesNode.add(game1); gamesNode.add(game2); ((ObjectNode) root).set("games", gamesNode); // 7. Append a new Node to ArrayNode ObjectNode email = mapper.createObjectNode(); email.put("type", "email"); email.put("ref", "[email protected]"); JsonNode contactNode = root.path("contact"); ((ArrayNode) contactNode).add(email); String resultUpdate = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(root); System.out.println("After Update " + resultUpdate); } catch (JsonGenerationException e) { e.printStackTrace(); } catch (JsonMappingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
出力
Before Update { "id" : 1, "name" : { "first" : "Yong", "last" : "Mook Kim" }, "contact" : [ { "type" : "phone/home", "ref" : "111-111-1234" }, { "type" : "phone/work", "ref" : "222-222-2222" } ] } After Update { "id" : 1000, "name" : { "first" : "Yong", "middle" : "M", "nickname" : "example" }, "contact" : [ { "type" : "phone/home", "ref" : "111-111-1234" }, { "type" : "phone/work", "ref" : "222-222-2222" }, { "type" : "email", "ref" : "[email protected]" } ], "position" : { "name" : "Developer", "years" : 10 }, "games" : [ { "name" : "Fall Out 4", "price" : 49.9 }, { "name" : "Dark Soul 3", "price" : 59.9 } ] }