diff --git a/json-2/README.md b/json-2/README.md
new file mode 100644
index 0000000000..e7c3043339
--- /dev/null
+++ b/json-2/README.md
@@ -0,0 +1,5 @@
+## JSON
+
+This module contains articles about JSON.
+
+### Relevant Articles:
diff --git a/json-2/pom.xml b/json-2/pom.xml
new file mode 100644
index 0000000000..72b3295b2b
--- /dev/null
+++ b/json-2/pom.xml
@@ -0,0 +1,41 @@
+
+
+ com.baeldung
+ json-2
+ 0.0.1-SNAPSHOT
+
+
+ parent-modules
+ com.baeldung
+ 1.0.0-SNAPSHOT
+
+ 4.0.0
+
+
+
+ com.jsoniter
+ jsoniter
+ ${jsoniter.version}
+
+
+
+ junit
+ junit
+ ${junit.version}
+ test
+
+
+
+ org.assertj
+ assertj-core
+ ${assertj-core.version}
+ test
+
+
+
+ 0.9.23
+ 3.11.1
+
+
diff --git a/json-2/src/main/java/com/baeldung/jsoniter/model/Name.java b/json-2/src/main/java/com/baeldung/jsoniter/model/Name.java
new file mode 100644
index 0000000000..ed5e221235
--- /dev/null
+++ b/json-2/src/main/java/com/baeldung/jsoniter/model/Name.java
@@ -0,0 +1,22 @@
+package com.baeldung.jsoniter.model;
+
+public class Name {
+ private String firstName;
+ private String surname;
+
+ public String getFirstName() {
+ return firstName;
+ }
+
+ public void setFirstName(String firstName) {
+ this.firstName = firstName;
+ }
+
+ public String getSurname() {
+ return surname;
+ }
+
+ public void setSurname(String surname) {
+ this.surname = surname;
+ }
+}
diff --git a/json-2/src/main/java/com/baeldung/jsoniter/model/Student.java b/json-2/src/main/java/com/baeldung/jsoniter/model/Student.java
new file mode 100644
index 0000000000..07c73dd18e
--- /dev/null
+++ b/json-2/src/main/java/com/baeldung/jsoniter/model/Student.java
@@ -0,0 +1,26 @@
+package com.baeldung.jsoniter.model;
+
+import com.jsoniter.annotation.JsonProperty;
+import com.jsoniter.fuzzy.MaybeStringIntDecoder;
+
+public class Student {
+ @JsonProperty(decoder = MaybeStringIntDecoder.class)
+ private int id;
+ private Name name;
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public Name getName() {
+ return name;
+ }
+
+ public void setName(Name name) {
+ this.name = name;
+ }
+}
diff --git a/json-2/src/test/java/com/baeldung/jsoniter/JsoniterIntroUnitTest.java b/json-2/src/test/java/com/baeldung/jsoniter/JsoniterIntroUnitTest.java
new file mode 100644
index 0000000000..09f82567a2
--- /dev/null
+++ b/json-2/src/test/java/com/baeldung/jsoniter/JsoniterIntroUnitTest.java
@@ -0,0 +1,85 @@
+package com.baeldung.jsoniter;
+
+import com.baeldung.jsoniter.model.Name;
+import com.baeldung.jsoniter.model.Student;
+import com.jsoniter.JsonIterator;
+import com.jsoniter.ValueType;
+import com.jsoniter.any.Any;
+
+import org.junit.Test;
+
+import static com.jsoniter.ValueType.STRING;
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class JsoniterIntroUnitTest {
+
+ @Test
+ public void whenParsedUsingBindAPI_thenConvertedToJavaObjectCorrectly() {
+ String input = "{\"id\":1,\"name\":{\"firstName\":\"Joe\",\"surname\":\"Blogg\"}}";
+
+ Student student = JsonIterator.deserialize(input, Student.class);
+
+ assertThat(student.getId()).isEqualTo(1);
+ assertThat(student.getName().getFirstName()).isEqualTo("Joe");
+ assertThat(student.getName().getSurname()).isEqualTo("Blogg");
+ }
+
+ @Test
+ public void givenTypeInJsonFuzzy_whenFieldIsMaybeDecoded_thenFieldParsedCorrectly() {
+ String input = "{\"id\":\"1\",\"name\":{\"firstName\":\"Joe\",\"surname\":\"Blogg\"}}";
+
+ Student student = JsonIterator.deserialize(input, Student.class);
+
+ assertThat(student.getId()).isEqualTo(1);
+ }
+
+ @Test
+ public void whenParsedUsingAnyAPI_thenFieldValueCanBeExtractedUsingTheFieldName() {
+ String input = "{\"id\":1,\"name\":{\"firstName\":\"Joe\",\"surname\":\"Blogg\"}}";
+
+ Any any = JsonIterator.deserialize(input);
+
+ assertThat(any.toInt("id")).isEqualTo(1);
+ assertThat(any.toString("name", "firstName")).isEqualTo("Joe");
+ assertThat(any.toString("name", "surname")).isEqualTo("Blogg");
+ }
+
+ @Test
+ public void whenParsedUsingAnyAPI_thenFieldValueTypeIsCorrect() {
+ String input = "{\"id\":1,\"name\":{\"firstName\":\"Joe\",\"surname\":\"Blogg\"}}";
+
+ Any any = JsonIterator.deserialize(input);
+
+ assertThat(any.get("id").valueType()).isEqualTo(ValueType.NUMBER);
+ assertThat(any.get("name").valueType()).isEqualTo(ValueType.OBJECT);
+ assertThat(any.get("error").valueType()).isEqualTo(ValueType.INVALID);
+ }
+
+ @Test
+ public void whenParsedUsingIteratorAPI_thenFieldValuesExtractedCorrectly() throws Exception {
+ Name name = new Name();
+ String input = "{ \"firstName\" : \"Joe\", \"surname\" : \"Blogg\" }";
+ JsonIterator iterator = JsonIterator.parse(input);
+
+ for (String field = iterator.readObject(); field != null; field = iterator.readObject()) {
+ switch (field) {
+ case "firstName":
+ if (iterator.whatIsNext() == ValueType.STRING) {
+ name.setFirstName(iterator.readString());
+ }
+ continue;
+ case "surname":
+ if (iterator.whatIsNext() == ValueType.STRING) {
+ name.setSurname(iterator.readString());
+ }
+ continue;
+ default:
+ iterator.skip();
+ }
+ }
+
+ assertThat(name.getFirstName()).isEqualTo("Joe");
+ assertThat(name.getSurname()).isEqualTo("Blogg");
+ }
+
+}
diff --git a/json-2/src/test/resources/Student.json b/json-2/src/test/resources/Student.json
new file mode 100644
index 0000000000..7ff3351e8e
--- /dev/null
+++ b/json-2/src/test/resources/Student.json
@@ -0,0 +1 @@
+{"id":1,"name":{"firstName": "Joe", "surname":"Blogg"}}
diff --git a/pom.xml b/pom.xml
index aeaef5f676..e641aebe7d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -485,6 +485,7 @@
jooby
jsf
json
+ json-2
json-path
jsoup
jta