Language/JAVA
[JAVA] ObjectUtil
yjkim_97
2021. 12. 19. 19:25
[2021.12.15]
이 포스트는 아래의 글에서 파생되었다. Object를 Map으로 변환하여, 특정 경로와 특정 값이 존재하는지 판단하는 유틸리티이다.
2021.12.19 - [IT story/Spring] - [Spring] RestTemplate - Java에서 HTTP 통신
Exception은 실제 구현할 때는 커스텀한 exception으로 내렸다.
ObjectUtil.java
/**
*
* @author yjkim
*
*/
@Slf4j
public class ObjectUtil
{
private static final String PATTERN_LIST_INDEX = "\\[[0-9]+\\]";
private static final String SPLIT_CHAR_KEY = "\\.";
private static Object findMapValueByKey(Map object, String key)
{
if(ObjectUtils.isEmpty(object))
{
throw new Exception("The target Map object is empty.");
}
if(StringUtils.isEmpty(key))
{
throw new Exception("The Key is empty.");
}
Object value = null;
Set<String> keySet = object.keySet();
if(keySet.contains(key))
{
value = object.get(key);
if(value instanceof Map)
{
value = (Map<String,Object>) value;
}
else if(value instanceof String)
{
value = String.valueOf(value);
}
else if(value instanceof Integer)
{
value = (Integer) value;
}
else if(value instanceof Boolean)
{
value = (Boolean) value;
}
else if(value instanceof List)
{
value = (List) value;
}
}
else
{
throw new Exception("Not found the " + key);
}
return value;
}
private static Object findListValueByIndex(List list, Integer index)
{
if(ObjectUtils.isEmpty(list))
{
throw new Exception("The find target list is empty.");
}
if(ObjectUtils.isEmpty(index))
{
throw new Exception("The index is empty.");
}
if(list.size() <= index)
{
throw new Exception("index more then list size.");
}
return list.get(index);
}
/**
* object에서 path의 값을 구한다.
* path가 존재하지 않는다면 {@link SurfinnRuntimeException} throw한다.
* ex) path : key1.key2[0].key3
*
* @param obj
* @param path
* @return
*/
public static Object getValueByPath(Object obj, String path)
{
System.out.println("찾을것!!! " + path + " => " + obj);
Object value = obj;
List<String> paths = Arrays.asList(path.split(SPLIT_CHAR_KEY));
Pattern pattern = Pattern.compile(PATTERN_LIST_INDEX);
for(String p : paths)
{
Matcher matcher = pattern.matcher(p);
if(matcher.find())
{
String mapKey = p.substring(0,matcher.start());
if(StringUtils.isNotBlank(mapKey))
{
if(value instanceof Map)
{
value = ObjectUtil.findMapValueByKey((Map) value,mapKey);
}
else
{
throw new Exception("The target object is not Map.");
}
}
matcher.reset();
while(matcher.find())
{
String group = matcher.group();
int idx = Integer.parseInt(group.substring(1, group.length() - 1));
if(obj instanceof List)
{
value = ObjectUtil.findListValueByIndex((List) value, idx);
}
else
{
throw new Exception("The target object is not List.");
}
}
}
else
{
if(value instanceof Map)
{
value = ObjectUtil.findMapValueByKey((Map) value,p);
}
else
{
throw new Exception("The target object is not Map.");
}
}
System.out.println(p + " => " + value);
}
System.out.println("결과 => " +value);
return value;
}
/**
* object에 path가 존재하는지 확인한다.
* true : 존재, false : 존재하지 않음
*
* {@link ObjectUtil#getValueByPath(Object, String)}에서
* {@link SurfinnRuntimeException}이 throw되면 존재하지 않은 것.
*
* @param obj
* @param path
* @return
*/
public static boolean existPath(Object obj, String path)
{
if(ObjectUtils.isEmpty(obj) || ObjectUtils.isEmpty(path))
{
return false;
}
try
{
ObjectUtil.getValueByPath(obj, path);
return true;
}
catch(Exception e)
{
return false;
}
}
}