diff --git a/json/pom.xml b/json/pom.xml
index c55e833b40..fa3fcafa65 100644
--- a/json/pom.xml
+++ b/json/pom.xml
@@ -33,6 +33,20 @@
json
20171018
+
+
+ junit
+ junit
+ 4.12
+ test
+
+
+
+ org.glassfish
+ javax.json
+ 1.1.2
+
+
diff --git a/json/src/main/java/com/baeldung/jsonpointer/JsonPointerCrud.java b/json/src/main/java/com/baeldung/jsonpointer/JsonPointerCrud.java
new file mode 100644
index 0000000000..4398aa7867
--- /dev/null
+++ b/json/src/main/java/com/baeldung/jsonpointer/JsonPointerCrud.java
@@ -0,0 +1,95 @@
+package com.baeldung.jsonpointer;
+
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+
+import javax.json.Json;
+import javax.json.JsonObject;
+import javax.json.JsonPointer;
+import javax.json.JsonReader;
+import javax.json.JsonString;
+import javax.json.JsonStructure;
+
+public class JsonPointerCrud {
+
+ private JsonStructure jsonStructure = null;
+
+ public JsonPointerCrud(String fileName) throws IOException {
+
+ try (JsonReader reader = Json.createReader(Files.newBufferedReader(Paths.get(fileName)))) {
+ jsonStructure = reader.read();
+ } catch (FileNotFoundException e) {
+ System.out.println("Error to open json file: " + e.getMessage());
+ }
+
+ }
+
+ public JsonPointerCrud(InputStream stream) {
+
+ JsonReader reader = Json.createReader(stream);
+ jsonStructure = reader.read();
+ reader.close();
+
+ }
+
+ public JsonStructure insert(String key, String value) {
+
+ JsonPointer jsonPointer = Json.createPointer("/" + key);
+ JsonString jsonValue = Json.createValue(value);
+ jsonStructure = jsonPointer.add(jsonStructure, jsonValue);
+
+ return jsonStructure;
+
+ }
+
+ public JsonStructure update(String key, String newValue) {
+
+ JsonPointer jsonPointer = Json.createPointer("/" + key);
+ JsonString jsonNewValue = Json.createValue(newValue);
+ jsonStructure = jsonPointer.replace(jsonStructure, jsonNewValue);
+
+ return jsonStructure;
+ }
+
+ public JsonStructure delete(String key) {
+
+ JsonPointer jsonPointer = Json.createPointer("/" + key);
+ jsonPointer.getValue(jsonStructure);
+ jsonStructure = jsonPointer.remove(jsonStructure);
+
+ return jsonStructure;
+
+ }
+
+ public String fetchValueFromKey(String key) {
+ JsonPointer jsonPointer = Json.createPointer("/" + key);
+ JsonString jsonString = (JsonString) jsonPointer.getValue(jsonStructure);
+
+ return jsonString.getString();
+ }
+
+ public String fetchListValues(String key) {
+ JsonPointer jsonPointer = Json.createPointer("/" + key);
+ JsonObject jsonObject = (JsonObject) jsonPointer.getValue(jsonStructure);
+
+ return jsonObject.toString();
+ }
+
+ public String fetchFullJSON() {
+ JsonPointer jsonPointer = Json.createPointer("");
+ JsonObject jsonObject = (JsonObject) jsonPointer.getValue(jsonStructure);
+
+ return jsonObject.toString();
+
+ }
+
+ public boolean check(String key) {
+ JsonPointer jsonPointer = Json.createPointer("/" + key);
+ boolean found = jsonPointer.containsValue(jsonStructure);
+
+ return found;
+ }
+}
diff --git a/json/src/test/java/com/baeldung/jsonpointer/JsonPointerCrudUnitTest.java b/json/src/test/java/com/baeldung/jsonpointer/JsonPointerCrudUnitTest.java
new file mode 100644
index 0000000000..c1553db325
--- /dev/null
+++ b/json/src/test/java/com/baeldung/jsonpointer/JsonPointerCrudUnitTest.java
@@ -0,0 +1,59 @@
+package com.baeldung.jsonpointer;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+
+public class JsonPointerCrudUnitTest {
+
+ @Test
+ public void testJsonPointerCrudForAddress() {
+
+ JsonPointerCrud jsonPointerCrud = new JsonPointerCrud(JsonPointerCrudUnitTest.class.getResourceAsStream("/address.json"));
+
+ assertFalse(jsonPointerCrud.check("city"));
+
+ // insert a value
+ jsonPointerCrud.insert("city", "Rio de Janeiro");
+
+ assertTrue(jsonPointerCrud.check("city"));
+
+ // fetch full json
+ String fullJSON = jsonPointerCrud.fetchFullJSON();
+
+ assertTrue(fullJSON.contains("name"));
+
+ assertTrue(fullJSON.contains("city"));
+
+ // fetch value
+ String cityName = jsonPointerCrud.fetchValueFromKey("city");
+
+ assertEquals(cityName, "Rio de Janeiro");
+
+ // update value
+ jsonPointerCrud.update("city", "Sao Paulo");
+
+ // fetch value
+ cityName = jsonPointerCrud.fetchValueFromKey("city");
+
+ assertEquals(cityName, "Sao Paulo");
+
+ // delete
+ jsonPointerCrud.delete("city");
+
+ assertFalse(jsonPointerCrud.check("city"));
+
+ }
+
+ @Test
+ public void testJsonPointerCrudForBooks() {
+
+ JsonPointerCrud jsonPointerCrud = new JsonPointerCrud(JsonPointerCrudUnitTest.class.getResourceAsStream("/books.json"));
+
+ // fetch value
+ String book = jsonPointerCrud.fetchListValues("books/1");
+
+ assertEquals(book, "{\"title\":\"Title 2\",\"author\":\"John Doe\"}");
+
+ }
+}
\ No newline at end of file
diff --git a/json/src/test/resources/address.json b/json/src/test/resources/address.json
new file mode 100644
index 0000000000..599fcae12b
--- /dev/null
+++ b/json/src/test/resources/address.json
@@ -0,0 +1,4 @@
+{
+ "name": "Customer 01",
+ "street name": "Street 01"
+}
\ No newline at end of file
diff --git a/json/src/test/resources/books.json b/json/src/test/resources/books.json
new file mode 100644
index 0000000000..0defc3de98
--- /dev/null
+++ b/json/src/test/resources/books.json
@@ -0,0 +1,7 @@
+{
+ "library": "My Personal Library",
+ "books": [
+ { "title":"Title 1", "author":"Jane Doe" },
+ { "title":"Title 2", "author":"John Doe" }
+ ]
+}
\ No newline at end of file