diff --git a/json/README.md b/json/README.md
new file mode 100644
index 0000000000..c47eca3e84
--- /dev/null
+++ b/json/README.md
@@ -0,0 +1,7 @@
+=========
+
+## Fast-Json
+
+### Relevant Articles:
+- [Introduction to JSON Schema in Java](http://www.baeldung.com/introduction-to-json-schema-in-java)
+- [A Guide to FastJson](http://www.baeldung.com/????????)
diff --git a/json/pom.xml b/json/pom.xml
index 47f1f25aa2..4d9efe56e4 100644
--- a/json/pom.xml
+++ b/json/pom.xml
@@ -13,6 +13,12 @@
1.3.0
+
+ com.alibaba
+ fastjson
+ 1.2.13
+
+
junit
junit
diff --git a/json/src/test/java/org/baeldung/json/schema/JSONSchemaTest.java b/json/src/test/java/com/baeldung/json/schema/JSONSchemaTest.java
similarity index 88%
rename from json/src/test/java/org/baeldung/json/schema/JSONSchemaTest.java
rename to json/src/test/java/com/baeldung/json/schema/JSONSchemaTest.java
index 273fd48bac..bd4aaee682 100644
--- a/json/src/test/java/org/baeldung/json/schema/JSONSchemaTest.java
+++ b/json/src/test/java/com/baeldung/json/schema/JSONSchemaTest.java
@@ -1,31 +1,32 @@
-package org.baeldung.json.schema;
-
-import org.everit.json.schema.Schema;
-import org.everit.json.schema.loader.SchemaLoader;
-
-import org.json.JSONObject;
-import org.json.JSONTokener;
-import org.junit.Test;
-
-public class JSONSchemaTest {
-
- @Test
- public void givenInvalidInput_whenValidating_thenInvalid() {
-
- JSONObject jsonSchema = new JSONObject(new JSONTokener(JSONSchemaTest.class.getResourceAsStream("/schema.json")));
- JSONObject jsonSubject = new JSONObject(new JSONTokener(JSONSchemaTest.class.getResourceAsStream("/product_invalid.json")));
-
- Schema schema = SchemaLoader.load(jsonSchema);
- schema.validate(jsonSubject);
- }
-
- @Test
- public void givenValidInput_whenValidating_thenValid() {
-
- JSONObject jsonSchema = new JSONObject(new JSONTokener(JSONSchemaTest.class.getResourceAsStream("/schema.json")));
- JSONObject jsonSubject = new JSONObject(new JSONTokener(JSONSchemaTest.class.getResourceAsStream("/product_valid.json")));
-
- Schema schema = SchemaLoader.load(jsonSchema);
- schema.validate(jsonSubject);
- }
-}
+package com.baeldung.json.schema;
+
+import org.everit.json.schema.Schema;
+import org.everit.json.schema.ValidationException;
+import org.everit.json.schema.loader.SchemaLoader;
+
+import org.json.JSONObject;
+import org.json.JSONTokener;
+import org.junit.Test;
+
+public class JSONSchemaTest {
+
+ @Test(expected = ValidationException.class)
+ public void givenInvalidInput_whenValidating_thenInvalid() {
+
+ JSONObject jsonSchema = new JSONObject(new JSONTokener(JSONSchemaTest.class.getResourceAsStream("/schema.json")));
+ JSONObject jsonSubject = new JSONObject(new JSONTokener(JSONSchemaTest.class.getResourceAsStream("/product_invalid.json")));
+
+ Schema schema = SchemaLoader.load(jsonSchema);
+ schema.validate(jsonSubject);
+ }
+
+ @Test
+ public void givenValidInput_whenValidating_thenValid() {
+
+ JSONObject jsonSchema = new JSONObject(new JSONTokener(JSONSchemaTest.class.getResourceAsStream("/schema.json")));
+ JSONObject jsonSubject = new JSONObject(new JSONTokener(JSONSchemaTest.class.getResourceAsStream("/product_valid.json")));
+
+ Schema schema = SchemaLoader.load(jsonSchema);
+ schema.validate(jsonSubject);
+ }
+}
diff --git a/json/src/test/java/fast_json/FastJsonTests.java b/json/src/test/java/fast_json/FastJsonTests.java
new file mode 100644
index 0000000000..7b7e3c0434
--- /dev/null
+++ b/json/src/test/java/fast_json/FastJsonTests.java
@@ -0,0 +1,104 @@
+package fast_json;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.serializer.BeanContext;
+import com.alibaba.fastjson.serializer.ContextValueFilter;
+import com.alibaba.fastjson.serializer.NameFilter;
+import com.alibaba.fastjson.serializer.SerializeConfig;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+
+public class FastJsonTests {
+ private List listOfPersons;
+
+ @Before
+ public void setUp() {
+ listOfPersons = new ArrayList();
+ Calendar calendar = Calendar.getInstance();
+ calendar.set(2016, 6, 24);
+ listOfPersons.add(new Person(15, "John", "Doe", calendar.getTime()));
+ listOfPersons.add(new Person(20, "Janette", "Doe", calendar.getTime()));
+ }
+
+ @Test
+ public void whenJavaList_thanConvertToJsonCorrect() {
+ String personJsonFormat = JSON.toJSONString(listOfPersons);
+ assertEquals(
+ personJsonFormat,
+ "[{\"FIRST NAME\":\"Doe\",\"LAST NAME\":\"John\",\"DATE OF BIRTH\":"
+ + "\"24/07/2016\"},{\"FIRST NAME\":\"Doe\",\"LAST NAME\":\"Janette\",\"DATE OF BIRTH\":"
+ + "\"24/07/2016\"}]");
+ }
+
+ @Test
+ public void whenJson_thanConvertToObjectCorrect() {
+ String personJsonFormat = JSON.toJSONString(listOfPersons.get(0));
+ Person newPerson = JSON.parseObject(personJsonFormat, Person.class);
+ assertEquals(newPerson.getAge(), 0); // serialize is set to false for age attribute
+ assertEquals(newPerson.getFirstName(), listOfPersons.get(0).getFirstName());
+ assertEquals(newPerson.getLastName(), listOfPersons.get(0).getLastName());
+ }
+
+ @Test
+ public void whenGenerateJson_thanGenerationCorrect() throws ParseException {
+ JSONArray jsonArray = new JSONArray();
+ for (int i = 0; i < 2; i++) {
+ JSONObject jsonObject = new JSONObject();
+ jsonObject.put("FIRST NAME", "John" + i);
+ jsonObject.put("LAST NAME", "Doe" + i);
+ jsonObject.put("DATE OF BIRTH", "2016/12/12 12:12:12");
+ jsonArray.add(jsonObject);
+ }
+ assertEquals(
+ jsonArray.toString(),
+ "[{\"LAST NAME\":\"Doe0\",\"DATE OF BIRTH\":"
+ + "\"2016/12/12 12:12:12\",\"FIRST NAME\":\"John0\"},{\"LAST NAME\":\"Doe1\","
+ + "\"DATE OF BIRTH\":\"2016/12/12 12:12:12\",\"FIRST NAME\":\"John1\"}]");
+ }
+
+ @Test
+ public void givenContextFilter_whenJavaObject_thanJsonCorrect() {
+ ContextValueFilter valueFilter = new ContextValueFilter() {
+ public Object process(BeanContext context, Object object,
+ String name, Object value) {
+ if (name.equals("DATE OF BIRTH")) {
+ return "NOT TO DISCLOSE";
+ }
+ if (value.equals("John") || value.equals("Doe")) {
+ return ((String) value).toUpperCase();
+ } else {
+ return null;
+ }
+ }
+ };
+ JSON.toJSONString(listOfPersons, valueFilter);
+ }
+
+ @Test
+ public void givenSerializeConfig_whenJavaObject_thanJsonCorrect() {
+ NameFilter formatName = new NameFilter() {
+ public String process(Object object, String name, Object value) {
+ return name.toLowerCase().replace(" ", "_");
+ }
+ };
+ SerializeConfig.getGlobalInstance().addFilter(Person.class, formatName);
+ String jsonOutput = JSON.toJSONStringWithDateFormat(listOfPersons,
+ "yyyy-MM-dd");
+ assertEquals(
+ jsonOutput,
+ "[{\"first_name\":\"Doe\",\"last_name\":\"John\","
+ + "\"date_of_birth\":\"2016-07-24\"},{\"first_name\":\"Doe\",\"last_name\":"
+ + "\"Janette\",\"date_of_birth\":\"2016-07-24\"}]");
+ // resetting custom serializer
+ SerializeConfig.getGlobalInstance().put(Person.class, null);
+ }
+}
diff --git a/json/src/test/java/fast_json/Person.java b/json/src/test/java/fast_json/Person.java
new file mode 100644
index 0000000000..0eac58cdfd
--- /dev/null
+++ b/json/src/test/java/fast_json/Person.java
@@ -0,0 +1,70 @@
+package fast_json;
+
+import com.alibaba.fastjson.annotation.JSONField;
+
+import java.util.Date;
+
+public class Person {
+
+ @JSONField(name = "AGE", serialize = false, deserialize = false)
+ private int age;
+
+ @JSONField(name = "LAST NAME", ordinal = 2)
+ private String lastName;
+
+ @JSONField(name = "FIRST NAME", ordinal = 1)
+ private String firstName;
+
+ @JSONField(name = "DATE OF BIRTH", format = "dd/MM/yyyy", ordinal = 3)
+ private Date dateOfBirth;
+
+ public Person() {
+
+ }
+
+ public Person(int age, String lastName, String firstName, Date dateOfBirth) {
+ super();
+ this.age = age;
+ this.lastName = lastName;
+ this.firstName = firstName;
+ this.dateOfBirth = dateOfBirth;
+ }
+
+ @Override
+ public String toString() {
+ return "Person [age=" + age + ", lastName=" + lastName + ", firstName="
+ + firstName + ", dateOfBirth=" + dateOfBirth + "]";
+ }
+
+ public int getAge() {
+ return age;
+ }
+
+ public void setAge(int age) {
+ this.age = age;
+ }
+
+ public String getLastName() {
+ return lastName;
+ }
+
+ public void setLastName(String lastName) {
+ this.lastName = lastName;
+ }
+
+ public String getFirstName() {
+ return firstName;
+ }
+
+ public void setFirstName(String firstName) {
+ this.firstName = firstName;
+ }
+
+ public Date getDateOfBirth() {
+ return dateOfBirth;
+ }
+
+ public void setDateOfBirth(Date dateOfBirth) {
+ this.dateOfBirth = dateOfBirth;
+ }
+}
diff --git a/pom.xml b/pom.xml
index 82cf85208c..469e0a0b74 100644
--- a/pom.xml
+++ b/pom.xml
@@ -29,6 +29,7 @@
jjwt
jooq-spring
json-path
+ json
mockito
mocks
jee7schedule