You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

750 lines
21 KiB
Java

7 years ago
package com.ruoyi.common.json;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.ruoyi.common.utils.StringUtils;
/**
* Map JSON
*
* @author ruoyi
*/
public class JSONObject extends LinkedHashMap<String, Object>
{
private static final long serialVersionUID = 1L;
private static final Pattern arrayNamePattern = Pattern.compile("(\\w+)((\\[\\d+\\])+)");
private static final ObjectMapper objectMapper = new ObjectMapper();
/**
*
*/
public static class JSONArray extends ArrayList<Object>
{
private static final long serialVersionUID = 1L;
public JSONArray()
{
super();
}
public JSONArray(int size)
{
super(size);
}
@Override
public String toString()
{
try
{
return JSON.marshal(this);
}
catch (Exception e)
{
throw new RuntimeException(e);
}
}
@Override
public Object set(int index, Object element)
{
return super.set(index, transfer(element));
}
@Override
public boolean add(Object element)
{
return super.add(transfer(element));
}
@Override
public void add(int index, Object element)
{
super.add(index, transfer(element));
}
}
public JSONObject()
{
super();
}
public JSONObject(final JSONObject other)
{
super(other);
}
@Override
public String toString()
{
try
{
return JSON.marshal(this);
}
catch (Exception e)
{
throw new RuntimeException(e);
}
}
/**
*
*
* @return
*/
public String toCompactString()
{
try
{
return objectMapper.writeValueAsString(this);
}
catch (Exception e)
{
throw new RuntimeException(e);
}
}
/**
* null
*
* @param name
* @return null
*/
public Integer intValue(final String name)
{
return valueAsInt(value(name));
}
/**
* defaultValue
*
* @param name
* @param defaultValue
* @return defaultValue
*/
public Integer intValue(final String name, final Integer defaultValue)
{
return StringUtils.nvl(intValue(name), defaultValue);
}
/**
* null
*
* @param name
* @return null
*/
public Long longValue(final String name)
{
return valueAsLong(value(name));
}
/**
* defaultValue
*
* @param name
* @param defaultValue
* @return defaultValue
*/
public Long longValue(final String name, final Long defaultValue)
{
return StringUtils.nvl(longValue(name), defaultValue);
}
/**
* null
*
* @param name
* @return null
*/
public Boolean boolValue(final String name)
{
return valueAsBool(value(name));
}
/**
* defaultValue
*
* @param name
* @param defaultValue
* @return defaultValue
*/
public Boolean boolValue(final String name, final Boolean defaultValue)
{
return StringUtils.nvl(boolValue(name), defaultValue);
}
/**
* null
*
* @param name
* @return null
*/
public String strValue(final String name)
{
return valueAsStr(value(name));
}
/**
* defaultValue
*
* @param name
* @param defaultValue
* @return defaultValue
*/
public String strValue(final String name, final String defaultValue)
{
return StringUtils.nvl(strValue(name), defaultValue);
}
/**
*
*
* @param name
* @return
*/
public Object value(final String name)
{
final int indexDot = name.indexOf('.');
if (indexDot >= 0)
{
return obj(name.substring(0, indexDot)).value(name.substring(indexDot + 1));
}
else
{
final Matcher matcher = arrayNamePattern.matcher(name);
if (matcher.find())
{
return endArray(matcher.group(1), matcher.group(2), new EndArrayCallback<Object>()
{
@Override
7 years ago
public Object callback(JSONArray arr, int index)
{
return elementAt(arr, index);
}
});
}
else
{
return get(name);
}
}
}
/**
*
*
* @param name
* @param value
* @return
*/
public JSONObject value(final String name, final Object value)
{
final int indexDot = name.indexOf('.');
if (indexDot >= 0)
{
obj(name.substring(0, indexDot)).value(name.substring(indexDot + 1), value);
}
else
{
final Matcher matcher = arrayNamePattern.matcher(name);
if (matcher.find())
{
endArray(matcher.group(1), matcher.group(2), new EndArrayCallback<Void>()
{
@Override
7 years ago
public Void callback(JSONArray arr, int index)
{
elementAt(arr, index, value);
return null;
}
});
}
else
{
set(name, value);
}
}
return this;
}
/**
* MessageObject
*
* @param name
* @return MessageObject
*/
public JSONObject obj(final String name)
{
final Matcher matcher = arrayNamePattern.matcher(name);
if (matcher.find())
{
return endArray(matcher.group(1), matcher.group(2), new EndArrayCallback<JSONObject>()
{
@Override
7 years ago
public JSONObject callback(JSONArray arr, int index)
{
return objAt(arr, index);
}
});
}
else
{
JSONObject obj = getObj(name);
if (obj == null)
{
obj = new JSONObject();
put(name, obj);
}
return obj;
}
}
/**
*
*
* @param name
* @return List
*/
public JSONArray arr(final String name)
{
JSONArray arr = getArr(name);
if (arr == null)
{
arr = new JSONArray();
put(name, arr);
}
return arr;
}
/**
*
*
* @param name
* @return
*/
public JSONObject getObj(final String name)
{
return (JSONObject) get(name);
}
/**
*
*
* @param name
* @return
*/
public JSONArray getArr(final String name)
{
return (JSONArray) get(name);
}
/**
* null
*
* @param name
* @return
*/
public Integer getInt(final String name)
{
return valueAsInt(get(name));
}
/**
* defaultValue
*
* @param name
* @param defaultValue
* @return
*/
public Integer getInt(final String name, Integer defaultValue)
{
return StringUtils.nvl(getInt(name), defaultValue);
}
/**
* null
*
* @param name
* @return
*/
public Long getLong(final String name)
{
return valueAsLong(get(name));
}
/**
* defaultValue
*
* @param name
* @param defaultValue
* @return
*/
public Long getLong(final String name, Long defaultValue)
{
return StringUtils.nvl(getLong(name), defaultValue);
}
/**
* null
*
* @param name
* @return
*/
public String getStr(final String name)
{
return valueAsStr(get(name));
}
/**
* defaultValue
*
* @param name
* @param defaultValue
* @return
*/
public String getStr(final String name, final String defaultValue)
{
return StringUtils.nvl(getStr(name), defaultValue);
}
/**
* null
*
* @param name
* @return
*/
public Boolean getBool(final String name)
{
return valueAsBool(get(name));
}
/**
* defaultValue
*
* @param name
* @param defaultValue
* @return
*/
public Boolean getBool(final String name, final Boolean defaultValue)
{
return StringUtils.nvl(getBool(name), defaultValue);
}
/**
*
*
* @param name
* @param value MessageObject MapMessageObjectMessageObject
* Map
* @return
*/
public JSONObject set(final String name, final Object value)
{
put(name, value);
return this;
}
/**
* Java Bean
*
* @param beanClass Java Bean
* @return Java Bean
*/
public <T> T asBean(Class<T> beanClass)
{
try
{
return JSON.unmarshal(JSON.marshal(this), beanClass);
}
catch (Exception e)
{
throw new RuntimeException(e);
}
}
/**
* value Map MessageObject Map MessageObject value Map
* MessageObject 使JSONMessageObject使 set(name, value)
*/
@Override
public Object put(String key, Object value)
{
return super.put(key, transfer(value));
}
public static Integer valueAsInt(Object value)
{
if (value instanceof Integer)
{
return (Integer) value;
}
else if (value instanceof Number)
{
return ((Number) value).intValue();
}
else if (value instanceof String)
{
return Integer.valueOf((String) value);
}
else if (value instanceof Boolean)
{
return ((Boolean) value) ? 1 : 0;
}
else
{
return null;
}
}
public static Long valueAsLong(Object value)
{
if (value instanceof Long)
{
return (Long) value;
}
else if (value instanceof Number)
{
return ((Number) value).longValue();
}
else if (value instanceof String)
{
return Long.valueOf((String) value);
}
else if (value instanceof Boolean)
{
return ((Boolean) value) ? 1L : 0L;
}
else
{
return null;
}
}
public static String valueAsStr(Object value)
{
if (value instanceof String)
{
return (String) value;
}
else if (value != null)
{
return value.toString();
}
else
{
return null;
}
}
public static Boolean valueAsBool(Object value)
{
if (value instanceof Boolean)
{
return (Boolean) value;
}
else if (value instanceof Number)
{
return ((Number) value).doubleValue() != 0.0;
}
else if (value instanceof String)
{
return Boolean.valueOf((String) value);
}
else
{
return null;
}
}
/**
* MapMessageObjectMessageObject
*
* @param value
* @return
*/
@SuppressWarnings("unchecked")
private static Object transfer(final Object value)
{
if (!(value instanceof JSONObject) && value instanceof Map)
{
return toObj((Map<String, Object>) value);
}
else if (!(value instanceof JSONArray) && value instanceof Collection)
{
return toArr((Collection<Object>) value);
}
else
{
return value;
}
}
private static JSONArray toArr(final Collection<Object> list)
{
final JSONArray arr = new JSONArray(list.size());
for (final Object element : list)
{
arr.add(element);
}
return arr;
}
private static JSONObject toObj(final Map<String, Object> map)
{
final JSONObject obj = new JSONObject();
for (final Map.Entry<String, Object> ent : map.entrySet())
{
obj.put(ent.getKey(), transfer(ent.getValue()));
}
return obj;
}
/**
*
*
* @param arr
* @param index
* @return
*/
private static JSONArray arrayAt(JSONArray arr, int index)
{
expand(arr, index);
if (arr.get(index) == null)
{
arr.set(index, new JSONArray());
}
return (JSONArray) arr.get(index);
}
/**
*
*
* @param arr
* @param index
* @return
*/
private static JSONObject objAt(final JSONArray arr, int index)
{
expand(arr, index);
if (arr.get(index) == null)
{
arr.set(index, new JSONObject());
}
return (JSONObject) arr.get(index);
}
/**
*
*
* @param arr
* @param index
* @param value
*/
private static void elementAt(final JSONArray arr, final int index, final Object value)
{
expand(arr, index).set(index, value);
}
/**
*
*
* @param arr
* @param index
* @return
*/
private static Object elementAt(final JSONArray arr, final int index)
{
return expand(arr, index).get(index);
}
/**
* 访
*
* @param arr
* @param index
* @return
*/
private static JSONArray expand(final JSONArray arr, final int index)
{
while (arr.size() <= index)
{
arr.add(null);
}
return arr;
}
/**
*
*
* @author Mike
*
* @param <T>
*/
private interface EndArrayCallback<T>
{
/**
*
*
* @param arr
* @param index
* @return
*/
T callback(JSONArray arr, int index);
}
/**
* arrary[1][2][3] name=arrayindexStr=[1][2][3]callbackendArr
* array[1][2]indexe=3
*
* @param name
* @param indexesStr [1][2][3]
* @param callback
* @return
*/
private <T> T endArray(final String name, final String indexesStr, final EndArrayCallback<T> callback)
{
JSONArray endArr = arr(name);
final int[] indexes = parseIndexes(indexesStr);
int i = 0;
while (i < indexes.length - 1)
{
endArr = arrayAt(endArr, indexes[i++]);
}
return callback.callback(endArr, indexes[i]);
}
private static int[] parseIndexes(final String s)
{
int[] indexes = null;
List<Integer> list = new ArrayList<Integer>();
final StringTokenizer st = new StringTokenizer(s, "[]");
while (st.hasMoreTokens())
{
final int index = Integer.valueOf(st.nextToken());
if (index < 0)
{
throw new RuntimeException(String.format("Illegal index %1$d in \"%2$s\"", index, s));
}
list.add(index);
}
indexes = new int[list.size()];
int i = 0;
for (Integer tmp : list.toArray(new Integer[list.size()]))
{
indexes[i++] = tmp;
}
return indexes;
}
}