Tuesday, April 1, 2025

Check the date format of value

 public boolean isValidDateFormat(String format, String value) {
        Date date = null;
        try {
            SimpleDateFormat sdf = new SimpleDateFormat(format);
            date = sdf.parse(value);
            if (!value.equals(sdf.format(date))) {
                date = null;
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date != null;
    }

Monday, March 24, 2025

JSON Using Jackson API

Maven Dependency:

<!-- jackson-databind jar -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.18.3</version>
        </dependency>

 Class ObjectMapper:

// Create an object to ObjectMapper
ObjectMapper objectMapper = new ObjectMapper();

Create a JSON Object or Object Node:

It is similar to map put method. put method is overloaded to accept different types of data 
// Creating Node that maps to JSON Object structures in JSON content
ObjectNode bookingDetails = objectMapper.createObjectNode();
// String as field value
bookingDetails.put("firstname", "Jim");
bookingDetails.put("lastname", "Brown");
// integer as field value
bookingDetails.put("totalprice", 111);
// boolean as field value
bookingDetails.put("depositpaid", true);
bookingDetails.put("additionalneeds", "Breakfast");
Note: Duplicate field name. Will override the value.
bookingDetails.put("additionalneeds", "Lunch");
// To print created json object
String createdPlainJsonObject = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(bookingDetails);
System.out.println("Created plain JSON Object is : \n"+ createdPlainJsonObject);
Output :
Created plain JSON Object is : 
{
  "firstname" : "Jim",
  "lastname" : "Brown",
  "totalprice" : 111,
  "depositpaid" : true,
  "additionalneeds" : "Lunch"
}

Create a nested JSON Object or Object Node:

// Since requirement is to create a nested JSON Object
ObjectNode bookingDateDetails = objectMapper.createObjectNode();
bookingDateDetails.put("checkin", "2021-07-01");
bookingDateDetails.put("checkout", "2021-07-01");
We use set(String fieldName, JsonNode fieldValue) or replace(String fieldName, JsonNode fieldValue) 
bookingDetails.set("bookingdates", bookingDateDetails);
// To get the created json object as string. Use writerWithDefaultPrettyPrinter() for proper formatting
String createdNestedJsonObject = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(bookingDetails);
System.out.println("Created nested JSON Object is : \n"+ createdNestedJsonObject); 
Output:
Created nested JSON Object is : 
{
  "firstname" : "Jim",
  "lastname" : "Brown",
  "totalprice" : 111,
  "depositpaid" : true,
  "additionalneeds" : "Lunch",
  "bookingdates" : {
    "checkin" : "2021-07-01",
    "checkout" : "2021-07-01"
  }
}  

 Retrieve a field value from JSON Object or ObjectNode:

We can retrieve field value by passing field name. Since it is string, use asText().
String firstName = bookingDetails.get("firstname").asText();
System.out.println("First name is : "+firstName);
 
// We can use asText() as well but return type will be string
boolean depositpaid = bookingDetails.get("depositpaid").asBoolean();
System.out.println("deposit paid is : "+depositpaid);
 
// To retrieve value of nested ObjectNode
bookingDetails.get("bookingdates").get("checkin").asText();
System.out.println("Checkin date is : "+depositpaid);
Output:
First name is : Jim
deposit paid is : true
Checkin date is : 2021-07-01

Retrieve all field names from JSON Object or Object Node:

To retrieve all field names from a ObjectNode, we need to use fieldNames() methods which returns an Iterator<String>.
// To get all field names
System.out.println("Count of fields in ObjectNode : "+ bookingDetails.size());
Iterator allFieldNames = bookingDetails.fieldNames();
System.out.println("Fields are : ");
while(allFieldNames.hasNext())
{
   System.out.println(allFieldNames.next());
}
Output:
Count of fields in ObjectNode : 6
Fields are : 
firstname
lastname
totalprice
depositpaid
additionalneeds
bookingdates

Retrieve all field values from from JSON Object or ObjectNode:

To retrieve all field values from an ObjectNode, use elements() method which returns an Iterator of JsonNode.
// To get all field values
Iterator allFieldValues = bookingDetails.elements();
System.out.println("Fields values are : ");
while(allFieldValues.hasNext())
{
    System.out.println(allFieldValues.next());
}
Output:
Fields values are : 
"Jim"
"Brown"
111
true
"Lunch"
{"checkin":"2021-07-01","checkout":"2021-07-01"}

Retrieve all key-value pair from JSON Object or ObjectNod:

We can use fields() method to get all fields (with both names and values) of a JSON Object. It returns an Iterator<Entry<String,JsonNode>>.   

// To get all key-value pair
Iterator> allFieldsAndValues = bookingDetails.fields();
System.out.println("All fields and their values are : ");
while(allFieldsAndValues.hasNext())
{
	Entry node = allFieldsAndValues.next();
	System.out.println("Key is : "+node.getKey()+" and its value is : "+node.getValue());
}
Output:
All fields and their values are : 
Key is : firstname and its value is : "Jim"
Key is : lastname and its value is : "Brown"
Key is : totalprice and its value is : 111
Key is : depositpaid and its value is : true
Key is : additionalneeds and its value is : "Lunch"
Key is : bookingdates and its value is : {"checkin":"2021-07-01","checkout":"2021-07-01"}

Remove a field from JSON Object or ObjectNode:

Use remove(String fieldName) method to remove a field from ObjectNode. It will return value of the field, if such field existed; null if not.

// To remove a field
String removedFieldValue = bookingDetails.remove("firstname").asText();
System.out.println("Value of Removed field is " + removedFieldValue);
String removedJsonObject = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(bookingDetails);
System.out.println("After removing field , JSON Object is : \n"+ removedJsonObject);
Output:
Value of Removed field is Jim
After removing field , JSON Object is : 
{
  "lastname" : "Brown",
  "totalprice" : 111,
  "depositpaid" : true,
  "additionalneeds" : "Lunch",
  "bookingdates" : {
    "checkin" : "2021-07-01",
    "checkout" : "2021-07-01"
  }
}

Update a field from JSON Object or ObjectNode:

We need to use put() method to update a field value if fieldValue is not another ObjectNode. If fieldValue is an ObjectNode use set() or replace() method.

// To replace a field value, use put() method for non ObjectNode type and replace() or set() for ObjectNode
bookingDetails.put("firstname", "Amod");
bookingDetails.put("firstname", "Aaditya");
String updatedJsonObject = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(bookingDetails);
System.out.println("After updating field , JSON Object is : \n"+ updatedJsonObject);
Output:
After updating field , JSON Object is : 
{
  "lastname" : "Brown",
  "totalprice" : 111,
  "depositpaid" : true,
  "additionalneeds" : "Lunch",
  "bookingdates" : {
    "checkin" : "2021-07-01",
    "checkout" : "2021-07-01"
  },
  "firstname" : "Aaditya"
}
 

JSON Array:

create JSON Array we use createArrayNode() method of ObjectMapper class. createArrayNode() will return reference of ArrayNode class. 

  1. Create an empty JSON Array.
  2. Create first JSON Object
  3. Create second JSON Object
  4. Add created JSON Objects to JSON Array
// Create an array Node
ArrayNode arrayNode = objectMapper.createArrayNode();
//add our elements directly to array
arrayNode.add("Apple").add("Banana").add("Cherry");
// Update an array Node
ArrayNode arrayNode = (ArrayNode) objectMapper.readTree(arrayNode);
arrayNode.set(1, "Blueberry");
This test demonstrates reading a JSON array into an ArrayNode and updating the value at index one from “Banana” to “Blueberry“.
Finally, we use the set() method to directly replace the value with a String, and Jackson automatically handles the conversion to a TextNode internally. 
// Create an array
ArrayNode parentArray =  objectMapper.createArrayNode();

Add created JSON Objects to JSON Array:

Class ArrayNode provides a method add() which can add one JSON Object to array at a time.

parentArray.add(firstBookingDetails);
parentArray.add(secondBookingDetails);

 To add multiple Object Nodes to array at a time we can use addAll() method which accepts a Collection<? extends JsonNode> . We can create a List (because List extends Collection)of all JSON Objects and add.

parentArray.addAll(Arrays.asList(firstBookingDetails,secondBookingDetails)); 
String jsonArrayAsString = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(parentArray);
System.out.println(jsonArrayAsString); 
Note:- If you try to add duplicate Object Nodes, it will be added to array. 

Retrieving JSON Object from JSON array using index:

// To get json array element using index
JsonNode firstElement = parentArray.get(0);
System.out.println(objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(firstElement));

Get size of JSON Array:

size() method can be used to get size of JSON Array.

int sizeOfArray = parentArray.size();
System.out.println("Size of array is "+sizeOfArray);

Iterate JSON Array:

iterator() method can be used to iterate through a JSON Array.

// To iterate JSON Array
Iterator iteraor = parentArray.iterator();
System.out.println("Prining Json Node using iterator : ");
while(iteraor.hasNext())
{
JsonNode currentJsonNode = iteraor.next();
System.out.println(objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(currentJsonNode));
}

Remove a JSON Object from JSON Array:

We can remove a JSON object from JSON Array using its index.

// To remove an element from array
parentArray.remove(0);
System.out.println("After removing first element from array : "+ objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(parentArray));

Empty JSON Array:

// To empty JSON Array
parentArray.removeAll();
System.out.println("After removing all elements from array : "+ objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(parentArray));