В Jackson вы можете использовать «Tree Model» для представления JSON и выполнять операции чтения и записи через «JsonNode», это похоже на дерево XML DOM.
P.S Протестировано с Джексоном 2.6.3
1. Пример обхода TreeModel
1.1 JSON-файл, верхний уровень представляет объект.
C: \\ 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 Использование Jackson TreeModel (
JsonNode
) для анализа и обхода над файлом JSON. Читайте комментарии для самоочевидных.
JacksonTreeModel.java
package com.mkyong.json; import java.io.File; import java.io.IOException; import com.fasterxml.jackson.core.JsonGenerationException; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; public class JacksonTreeModel { public static void main(String[]args) { try { long id; String firstName = ""; String middleName = ""; String lastName = ""; ObjectMapper mapper = new ObjectMapper(); JsonNode root = mapper.readTree(new File("c:\\user.json")); //Get id id = root.path("id").asLong(); System.out.println("id : " + id); //Get Name JsonNode nameNode = root.path("name"); if (nameNode.isMissingNode()) { //if "name" node is missing } else { firstName = nameNode.path("first").asText(); //missing node, just return empty string middleName = nameNode.path("middle").asText(); lastName = nameNode.path("last").asText(); System.out.println("firstName : " + firstName); System.out.println("middleName : " + middleName); System.out.println("lastName : " + lastName); } //Get Contact JsonNode contactNode = root.path("contact"); if (contactNode.isArray()) { //If this node an Arrray? } 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 type : phone/home ref : 111-111-1234 type : phone/work ref : 222-222-2222
2. Пример обхода TreeModel - часть 2
2.1 Файл JSON, верхний уровень представляет массив.
C: \\ 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 Концепция такая же, просто петли первого узла.
ObjectMapper mapper = new ObjectMapper(); JsonNode rootArray = mapper.readTree(new File("c:\\user2.json")); for(JsonNode root : rootArray){ //refer example 1.2 above, same ways to process nodes }
3. Пример TreeModel CRUD
3.1 В этом примере показано, как создавать, обновлять и удалять узлы (
ObjectNode
и` ArrayNode`). Прочитайте комментарии для самоочевидных.
JacksonTreeModel.java
package com.mkyong.json; import java.io.File; import java.io.IOException; 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; public class JacksonTreeModel { public static void main(String[]args) { try { ObjectMapper mapper = new ObjectMapper(); JsonNode root = mapper.readTree(new File("c:\\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 JsonNode nameNode = root.path("name"); if ("".equals(nameNode.path("middle").asText())) { ((ObjectNode) nameNode).put("middle", "M"); } //3. Create a new field in nameNode ((ObjectNode) nameNode).put("nickname", "mkyong"); //4. Remove last field in nameNode ((ObjectNode) 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(); game1.put("name", "Fall Out 4"); game1.put("price", 49.9); ObjectNode game2 = mapper.createObjectNode(); 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" : "mkyong" }, "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 }]}
Рекомендации
обработка с Джексоном: метод № 3/3: обход дерева], http://stackoverflow.com/questions/23271699/adding-property-to-json-using-jackson [StackOverflow
: Adding property to JSON using Jackson]. link://java/jackson-2-convert-java-object-to-from-json/[Jackson 2 –
Преобразовать объект в/из JSON]
ссылка://тег/джексон/[джексон]ссылка://тег/json/[json]ссылка://тег/модель дерева/[модель дерева]