Wednesday, July 7, 2021

Remove Null and Empty Keys from Json [Jackson Library]

import com.fasterxml.jackson.databind.JsonNode;


import java.util.Iterator;


/**

 * @author: Bhupendra Singh

 * @date 7/6/21 7:57 PM

 */

public class RemoveNullAndEmptyFromJson {

    /**

     * This method removes null/empty nodes from JsonNode.

     *

     * @param jsonNode

     * @return

     */

    public void removeNullAndEmptyNodesFromJsonNode(final JsonNode jsonNode) {


        if (jsonNode == null) {

            return;

        }

        if (jsonNode.isObject()) {

            final Iterator<JsonNode> iterator = jsonNode.iterator();

            while (iterator.hasNext()) {

                final JsonNode child = iterator.next();

                if (child.isNull() || child.isEmpty(null)) {

                    iterator.remove();

                } else {

                    removeNullAndEmptyNodesFromJsonNode(child);

                }

            }

        } else if (jsonNode.isArray()) {

            jsonNode.forEach(this::removeNullAndEmptyNodesFromJsonNode);

        }

    }

}

Remove given Key from the Json [Jackson library]

    /**

     * This method removes given key from JsonNode.

     *

     * @param jsonNode

     * @return

     */

    public static void removeGivenKeyFromJsonNode(@NonNull final JsonNode jsonNode,

                                                                                            @NonNull final String key) {

        if (jsonNode.isObject()) {

            final Iterator<String> iterator = jsonNode.fieldNames();

            while (iterator.hasNext()) {

                final String currentNodeName = iterator.next();

                final JsonNode currentNode = jsonNode.get(currentNodeName);


                if (StringUtils.equals(currentNodeName, key)) {

                    iterator.remove(); //To avoid concurrentModificationException

                    ((ObjectNode) jsonNode).remove(currentNodeName);

                } else {

                    // If field is Array then again search in all the array nodes.

                    if (currentNode.isArray()) {

                        removeGivenKeyFromJsonNode(currentNode, key);

                    }

                    removeGivenKeyFromJsonNode(currentNode, key);

                }

            }

        } else if (jsonNode.isArray()) {

            jsonNode.forEach(arrayElement -> {

                removeGivenKeyFromJsonNode(arrayElement, key);

            });

        }

    }

Traverse a Json using Jackson

import com.fasterxml.jackson.databind.JsonNode;

import com.fasterxml.jackson.databind.node.ObjectNode;

import org.apache.commons.lang3.StringUtils;


import java.util.Iterator;

import java.util.Map;

import java.util.Objects;


/**

 * @author: Bhupendra Singh@

 * @date 7/6/21 7:12 PM

 */

public class Traverse {

    /**

     * Traverse a Json using Jackson and also change the value of specific keys.

     *

     * @param jsonNode

     */

    public void traverse(final JsonNode jsonNode) {

        final Iterator<Map.Entry<String, JsonNode>> fieldsIterator = jsonNode.fields();

        while (fieldsIterator.hasNext()) {

            final Map.Entry<String, JsonNode> field = fieldsIterator.next();

            final String key = field.getKey();

            if (StringUtils.containsIgnoreCase(key, "KeyToBeChanged") && Objects.nonNull(

                field.getValue()) && !StringUtils.equalsIgnoreCase(field.getValue().toString(), "null")) {

                ((ObjectNode) jsonNode).put(key, "Value");

            }

            final JsonNode value = field.getValue();

            if (value.isContainerNode()) {

                traverse(value); // RECURSIVE CALL

            }

        }

    }


    /**

     * This method converts any json string to json node.

     *

     * @param jsonString

     * @return

     */

    public JsonNode toJsonNode(@NonNull final String jsonString) {

        try {

            return objectMapper.readTree(jsonString);

        } catch (final Exception e) {

            throw new RuntimeException("Failed to deserialize to JSONObject", e);

        }

    }

}


Convert EPOCH to Desired time format

import lombok.NonNull;


import java.time.Instant;

import java.time.ZoneOffset;

import java.time.ZonedDateTime;

import java.time.format.DateTimeFormatter;


/**

 * @author: Bhupendra Singh@

 * @date 7/6/21 6:59 PM

 */

public class EPOCHToLocalDateTime {

    /**

     * This methods converts the date from epoch to "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'" UTC format.

     * @param dateTime

     * @return

     */

    public String convertEPOCHToLocalDateTimeFormat(@NonNull final String dateTime) {

        // ZoneOffset.UTC can be replaced with desired zone.

        final ZonedDateTime zonedDateTime = 

                   Instant.ofEpochMilli(Long.parseLong(dateTime)).atZone(ZoneOffset.UTC);

        // "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'" can be replaced with desired pattern.

        final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");

        return zonedDateTime.format(formatter);

    }

}