SFJsonObject
unknown
plain_text
2 years ago
11 kB
15
Indexable
package com.nsi.storefront.service.coreapi.json;
import com.jayway.jsonpath.Configuration;
import com.jayway.jsonpath.DocumentContext;
import com.jayway.jsonpath.JsonPath;
import com.jayway.jsonpath.Option;
import com.nsi.storefront.service.coreapi.SFCoreAPIConstants;
import com.nsi.storefront.utils.SFLogger;
import com.nsi.storefront.utils.SFStringUtil;
import com.nsi.storefront.xmlschema.logging.types.LogEntryTypeEnum;
import net.minidev.json.JSONArray;
import org.json.JSONObject;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
/**
* ---------------- Copyright (c) 2020 Network Solutions, Inc. --------
* THis class holds {@link JsonPath} related info and provides methods to access
* <br>
* <br>
*
* @author dbusireddy
* @since 02-01-2020
* -------------------------------------------------------------------
*/
public class SFJsonObject {
private DocumentContext payloadObject;
private Configuration pathConfiguration = Configuration.builder().options(Option.DEFAULT_PATH_LEAF_TO_NULL).build();
private Map<String, String> fieldsAlreadyRetrieved = new HashMap<>();
/**
* @param jsonObject the {@link JSONObject}
*/
public SFJsonObject(JSONObject jsonObject) {
payloadObject = JsonPath.using(pathConfiguration).parse(jsonObject.toString());
}
/**
* @param jsonString the JSON content
*/
public SFJsonObject(String jsonString) {
payloadObject = JsonPath.using(pathConfiguration).parse(jsonString);
}
/**
* Returns field data for the given JSON path
*
* @param fieldPath the JSON path of the field
* @return field data for the given JSON path
*/
public String getField(String fieldPath) {
String data = null;
try {
if (!fieldsAlreadyRetrieved.containsKey(fieldPath)) {
String fieldValue = payloadObject.read(fieldPath, String.class);
if (SFCoreAPIConstants.NULL_STRING.equalsIgnoreCase(fieldValue)) {
fieldValue = null;
}
fieldsAlreadyRetrieved.put(fieldPath, fieldValue);
}
data = fieldsAlreadyRetrieved.get(fieldPath);
} catch (Exception exception) {
// Ignore
}
return data;
}
/**
* Returns number field data for the given JSON path
*
* MBrown May 2021 - differentiating an error for an absent field vs
* an invalid one.
*
* Also relaxing the logging levels for errors in this
* particular method - it is often called when null is a perfectly
* acceptable response, like:
*
* Integer startIndex = payLoad.getNumericField(SFCoreAPIConstants.START_INDEX_PATH) !=null ?
* payLoad.getNumericField(SFCoreAPIConstants.START_INDEX_PATH) : SFCoreAPIConstants.ONE ;
*
* Since startIndex is an optional param for many SFCore APIs, it will often be
* absent from the JSON object, and we don't want to log an error for that.
*
* @param fieldPath the JSON path of the field
* @return number field data for the given JSON path
*/
public Integer getNumericField(String fieldPath) {
return getNumericField(fieldPath, null);
}
public Integer getNumericField(String fieldPath, Integer defaultValue) {
Integer result = defaultValue;
String numericData = getField(fieldPath);
if (numericData == null ) {
SFLogger.printDebug("SFJsonObject.getNumericField - field " + fieldPath
+ " not found in JSON object.");
return result;
}
try {
result = Integer.parseInt(numericData);
} catch (NumberFormatException exception) {
SFLogger.printError(LogEntryTypeEnum.ERROR_MINOR_PROGRAM,
"Ignore this. SFJsonObject.getNumericField failed with invalid integer; "
+ "field = " + fieldPath + ", data = " + numericData);
}
return result;
}
/**
* Returns long field data for the given JSON path
*
* @param fieldPath the JSON path of the field
* @return number field data for the given JSON path
*/
public Long getLongField(String fieldPath) {
Long result = null;
try {
result = Long.parseLong(getField(fieldPath));
} catch (NumberFormatException exception) {
// Ignore
}
return result;
}
/**
* Returns boolean field data for the given JSON path
*
* @param fieldPath the JSON path of the field
* @return boolean field data for the given JSON path
*/
public boolean getBoolean(String fieldPath) {
return Boolean.parseBoolean(getField(fieldPath));
}
/**
* Returns jsonpath and respective field data for the given json paths as map
*
* @param pathList the list of json paths
* @return jsonpath and respective field data
*/
public Map<String, String> getFieldAndData(List<String> pathList) {
Map<String, String> data = null;
if (pathList != null && !pathList.isEmpty()) {
data = new LinkedHashMap<>();
for (String path : pathList) {
data.put(getFieldNameByPath(path), getField(path));
}
}
return data;
}
/**
* The node data for the given JSON path
*
* @param nodePath the node path in JSON
* @return the node data for the given JSON path
*/
public Map getNode(String nodePath) {
LinkedHashMap node = null;
try {
Object data = payloadObject.read(nodePath);
if (data instanceof LinkedHashMap) {
node = (LinkedHashMap) data;
}
} catch (Exception exception) {
// Ignore
}
return node;
}
/**
* The node data for the given JSON path
*
* @param nodePath the node path in JSON
* @return the node data for the given JSON path
*/
public List getMultipleFields(String nodePath) {
List nodeValues = null;
try {
Object data = payloadObject.read(nodePath);
if (data != null) {
nodeValues = new ArrayList();
if (data instanceof JSONArray) {
for (Object dataObj : ((JSONArray) data).toArray()) {
nodeValues.add(dataObj);
}
} else if (data instanceof LinkedHashMap) {
nodeValues.addAll(((LinkedHashMap) data).keySet());
} else {
nodeValues.add(data);
}
}
} catch (Exception exception) {
// Ignore
}
return nodeValues;
}
/**
* The node data for the given JSON path
*
* @param nodePath the node path in JSON
* @return the node data for the given JSON path
*/
public Object[] getFieldArray(String nodePath) {
List<Object> multipleFields = getMultipleFields(nodePath);
return !CollectionUtils.isEmpty(multipleFields)?multipleFields.toArray():null;
}
/**
* Returns the field name for the given json path
*
* @param aFieldPath the json filed path
* @return the field name for the given json path
*/
public static String getFieldNameByPath(String aFieldPath) {
String result = null;
if (aFieldPath != null) {
if (aFieldPath.contains(SFCoreAPIConstants.DOT)) {
String[] arr = aFieldPath.split(SFCoreAPIConstants.REG_EX_DOT);
result = arr[arr.length - SFCoreAPIConstants.ONE];
} else if (aFieldPath.contains((SFCoreAPIConstants.QUOTE))) {
List<String> list = Arrays.asList(aFieldPath.split(SFCoreAPIConstants.QUOTE));
if (list.size() >= SFCoreAPIConstants.TWO) {
result = list.get(list.size() - SFCoreAPIConstants.TWO);
}
}
}
return result;
}
/**
* Returns true if the given json path contains multiple results path
*
* @param path the json path
* @return true if the given json path contains multiple results path
*/
public boolean isMultiple(String path) {
Object data = null;
try {
data = payloadObject.read(path);
} catch (Exception exception) {
// Ignore
}
return path.contains(SFCoreAPIConstants.STAR)
|| data instanceof JSONArray || data instanceof LinkedHashMap;
}
/***
* This method can be used to get a list of long values when the field holds a string of long values separated with comma.
* eg. {"walletIds" : "1234567,12342345"}
*
* @param path
* @return
*/
public List<Long> getFieldLongList(String path){
List<Long> longValuesList = null;
try {
String data = getField(path);
if(!SFStringUtil.isEmpty(data)){
longValuesList = new ArrayList<Long>();
String[] dataArray = data.split(",");
for(String dataStr : dataArray){
Long longValue = Long.parseLong(dataStr);
longValuesList.add(longValue);
}
}
}catch (Exception e){
SFLogger.printError(LogEntryTypeEnum.ERROR_MINOR_PROGRAM,
"Ignore this. SFJsonObject.getFieldLongList failed to read JSON path");
}
return longValuesList;
}
/***
* This method can be used to get a list of String values when the field holds a string values separated with comma.
* eg. {"productType" : "Domain,Email,Website"}
*
* @param path
* @return
*/
public List<String> getFieldStringList(String path){
List<String> stringValuesList = null;
try {
String data = getField(path);
if(!SFStringUtil.isEmpty(data)){
stringValuesList = new ArrayList<String>();
String[] dataArray = data.split(",");
for(String dataStr : dataArray){
stringValuesList.add(dataStr);
}
}
}catch (Exception e){
SFLogger.printError(LogEntryTypeEnum.ERROR_MINOR_PROGRAM,
"Ignore this. SFJsonObject.getFieldStringList failed to read JSON path");
}
return stringValuesList;
}
}Editor is loading...