/*Copyright (C) 2020 THL A29 Limited, a Tencent company. All rights reserved.
This source code is licensed under the Apache License Version 2.0.*/
package apijson;
import java.util.*;
/**use this class instead of com.alibaba.fastjson.JSONMap
* @author Lemon
* @see #put
* @see #puts
* @see #putsAll
*/
//default class JSONMap extends LinkedHashMap {
public interface JSONMap, L extends List> extends Map {
static final String TAG = "JSONMap";
// åªè½æ¯ static public Map map = new LinkedHashMap<>();
///**ordered
// */
//default JSONMap() {
// super();
//}
///**transfer Object to JSONMap
// * @param object
// * @see {@link #JSONMap(Object)}
// */
//default JSONMap(Object object) {
// this();
// if (object instanceof Map) {
// @SuppressWarnings("unchecked")
// Map map = (Map) object;
// putAll(map);
// } else if (object != null) {
// String json = JSON.toJSONString(object);
// if (json != null) {
// Map map = JSON.parseObject(json);
// if (map != null) {
// putAll(map);
// }
// }
// }
//}
///**parse JSONMap with JSON String
// * @param json
// * @see {@link #JSONMap(String)}
// */
//default JSONMap(String json) {
// this();
// Map map = JSON.parseObject(json);
// if (map != null) {
// putAll(map);
// }
//}
///**transfer com.alibaba.fastjson.JSONMap to JSONMap
// * @param object
// * @see {@link #putsAll(Map extends String, ? extends Object>)}
// */
//default JSONMap(Map object) {
// this();
// putsAll(object);
//}
//public static JSONMap valueOf(Object obj) {
// JSONMap req = new JSONMap() {};
// Map m = JSON.parseObject(obj);
// if (m != null && ! m.isEmpty()) {
// req.map.putAll(m);
// }
// return req;
//}
//judge <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
String KEY_ARRAY = "[]";
/**夿æ¯å¦ä¸ºArrayçkey
* @param key
* @return
*/
public static boolean isArrayKey(String key) {
return key != null && key.endsWith(KEY_ARRAY);
}
/**夿æ¯å¦ä¸ºå¯¹åºTableçkey
* @param key
* @return
*/
public static boolean isTableKey(String key) {
return StringUtil.isBigName(key);
}
/**夿æ¯å¦ä¸ºå¯¹åºTableæ°ç»ç key
* @param key
* @return
*/
public static boolean isTableArray(String key) {
return isArrayKey(key) && isTableKey(key.substring(0, key.length() - KEY_ARRAY.length()));
}
//judge >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//JSONObjectå
å
³é®è¯ key <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
public static String KEY_ID = "id";
public static String KEY_ID_IN = KEY_ID + "{}";
public static String KEY_USER_ID = "userId";
public static String KEY_USER_ID_IN = KEY_USER_ID + "{}";
/**set "id":id in Table layer
* @param id
* @return
*/
default JSONMap setId(Long id) {
return puts(KEY_ID, id);
}
/**set "id{}":[] in Table layer
* @param list
* @return
*/
default JSONMap setIdIn(List list) {
return puts(KEY_ID_IN, list);
}
/**set "userId":userId in Table layer
* @param id
* @return
*/
default JSONMap setUserId(Long id) {
return puts(KEY_USER_ID, id);
}
/**set "userId{}":[] in Table layer
* @param list
* @return
*/
default JSONMap setUserIdIn(List list) {
return puts(KEY_USER_ID_IN, list);
}
int CACHE_ALL = 0;
int CACHE_ROM = 1;
int CACHE_RAM = 2;
String CACHE_ALL_STRING = "ALL";
String CACHE_ROM_STRING = "ROM";
String CACHE_RAM_STRING = "RAM";
//@keyå
³é®å齿¾è¿ä¸ªç±» <<<<<<<<<<<<<<<<<<<<<<
String KEY_TRY = "@try"; //å°è¯ï¼å¿½ç¥å¼å¸¸
String KEY_CATCH = "@catch"; //TODO ææå°å¼å¸¸åï¼å¤çæ¹å¼ null-ä¸å¤çï¼DEFAULT-è¿åé»è®¤å¼ï¼ORIGIN-è¿å请æ±éçåå§å¼
String KEY_DROP = "@drop"; //丢å¼ï¼ä¸è¿åï¼TODO åºè¯¥éè¿ fastjson ç ignore ä¹ç±»çæºå¶æ¥å¤çï¼é¿å
导è´ä¸é¢ç对象ä¹ä¸è¿å
// String KEY_KEEP = "@keep"; //ä¸å®ä¼è¿åï¼ä¸º null æ 空对象æ¶ï¼ä¼ä½¿ç¨é»è®¤å¼(é空)ï¼è§£å³å
¶å®å¯¹è±¡å 为ä¸å
³èç第ä¸ä¸ªå¯¹ä¸ºç©ºå¯¼è´ä¹ä¸è¿å
String KEY_DEFULT = "@default"; //TODO èªå®ä¹é»è®¤å¼ { "@default":true }ï¼@default å¯å®å
¨æ¿ä»£ @keep
String KEY_NULL = "@null"; //å¼ä¸º null çé®å¼å¯¹ "@null":"tag,pictureList"ï¼å
许 is NULL æ¡ä»¶å¤æï¼ SET tag = NULL ä¿®æ¹å¼ä¸º NULL ç
String KEY_CAST = "@cast"; //ç±»åè½¬æ¢ cast(date AS DATE)
String KEY_ROLE = "@role"; //è§è²ï¼æ¥æå¯¹æäºæ°æ®çæäºæä½çæé
String KEY_DATABASE = "@database"; //æ°æ®åºç±»åï¼é»è®¤ä¸ºMySQL
String KEY_DATASOURCE = "@datasource"; //æ°æ®æº
String KEY_NAMESPACE = "@namespace"; //å½å空é´ï¼Table å¨éé»è®¤ namespace å
æ¶éè¦å£°æ
String KEY_CATALOG = "@catalog"; //ç®å½ï¼Table å¨éé»è®¤ catalog å
æ¶éè¦å£°æ
String KEY_SCHEMA = "@schema"; //æ°æ®åºï¼Table å¨éé»è®¤ schema å
æ¶éè¦å£°æ
String KEY_EXPLAIN = "@explain"; //åæ true/false
String KEY_CACHE = "@cache"; //ç¼å RAM/ROM/ALL
String KEY_COLUMN = "@column"; //æ¥è¯¢çTableåæ®µæSQL彿°
String KEY_FROM = "@from"; //FROMè¯å¥
String KEY_COMBINE = "@combine"; //æ¡ä»¶ç»åï¼æ¯ä¸ªæ¡ä»¶keyåé¢å¯ä»¥æ¾&,|,!é»è¾å
³ç³» "id!{},&sex,!name&$"
String KEY_GROUP = "@group"; //åç»æ¹å¼
String KEY_HAVING = "@having"; //èå彿°æ¡ä»¶ï¼ä¸è¬å@groupä¸èµ·ç¨
String KEY_HAVING_AND = "@having&"; //èå彿°æ¡ä»¶ï¼ä¸è¬å@groupä¸èµ·ç¨
String KEY_SAMPLE = "@sample"; //åæ ·æ¹å¼
String KEY_LATEST = "@latest"; //æè¿æ¹å¼
String KEY_PARTITION = "@partition"; //ååºæ¹å¼
String KEY_FILL = "@fill"; //å¡«å
æ¹å¼
String KEY_ORDER = "@order"; //æåºæ¹å¼
String KEY_KEY = "@key"; // key æ å°ï¼year:left(date,4);name_tag:(name,tag)
String KEY_RAW = "@raw"; // èªå®ä¹åå§ SQL çæ®µ
String KEY_JSON = "@json"; //SQL Server æå段转为 JSON è¾åº
String KEY_METHOD = "@method"; // json 对象é
ç½®æä½æ¹æ³
String KEY_GET = "@get"; // json 对象é
ç½®æä½æ¹æ³
String KEY_GETS = "@gets"; // json 对象é
ç½®æä½æ¹æ³
String KEY_HEAD = "@head"; // json 对象é
ç½®æä½æ¹æ³
String KEY_HEADS = "@heads"; // json 对象é
ç½®æä½æ¹æ³
String KEY_POST = "@post"; // json 对象é
ç½®æä½æ¹æ³
String KEY_PUT = "@put"; // json 对象é
ç½®æä½æ¹æ³
String KEY_DELETE = "@delete"; // json 对象é
ç½®æä½æ¹æ³
List TABLE_KEY_LIST = new ArrayList<>(Arrays.asList(
KEY_ROLE,
KEY_DATABASE,
KEY_DATASOURCE,
KEY_NAMESPACE,
KEY_CATALOG,
KEY_SCHEMA,
KEY_EXPLAIN,
KEY_CACHE,
KEY_COLUMN,
KEY_FROM,
KEY_NULL,
KEY_CAST,
KEY_COMBINE,
KEY_GROUP,
KEY_HAVING,
KEY_HAVING_AND,
KEY_SAMPLE,
KEY_LATEST,
KEY_PARTITION,
KEY_FILL,
KEY_ORDER,
KEY_KEY,
KEY_RAW,
KEY_JSON,
KEY_METHOD,
KEY_GET,
KEY_GETS,
KEY_HEAD,
KEY_HEADS,
KEY_POST,
KEY_PUT,
KEY_DELETE
));
//@keyå
³é®å齿¾è¿ä¸ªç±» >>>>>>>>>>>>>>>>>>>>>>
/**set try, ignore exceptions
* @param tri
* @return this
*/
default JSONMap setTry(Boolean tri) {
return puts(KEY_TRY, tri);
}
/**set catch
* @param isCatch
* @return this
*/
default JSONMap setCatch(String isCatch) {
return puts(KEY_CATCH, isCatch);
}
/**set drop, data dropped will not return
* @param drop
* @return this
*/
default JSONMap setDrop(Boolean drop) {
return puts(KEY_DROP, drop);
}
/**set if has default
* @param hasDefault
* @return this
*/
default JSONMap setDefault(Boolean hasDefault) {
return puts(KEY_DEFULT, hasDefault);
}
/**set role of request sender
* @param role
* @return this
*/
default JSONMap setRole(String role) {
return puts(KEY_ROLE, role);
}
/**set database where table was puts
* @param database
* @return this
*/
default JSONMap setDatabase(String database) {
return puts(KEY_DATABASE, database);
}
/**set datasource where table was puts
* @param datasource
* @return this
*/
default JSONMap setDatasource(String datasource) {
return puts(KEY_DATASOURCE, datasource);
}
/**set namespace where table was puts
* @param namespace
* @return this
*/
default JSONMap setNamespace(String namespace) {
return puts(KEY_NAMESPACE, namespace);
}
/**set catalog where table was puts
* @param catalog
* @return this
*/
default JSONMap setCatalog(String catalog) {
return puts(KEY_CATALOG, catalog);
}
/**set schema where table was puts
* @param schema
* @return this
*/
default JSONMap setSchema(String schema) {
return puts(KEY_SCHEMA, schema);
}
/**set if return explain informations
* @param explain
* @return
*/
default JSONMap setExplain(Boolean explain) {
return puts(KEY_EXPLAIN, explain);
}
/**set cache type
* @param cache
* @return
* @see {@link #CACHE_ALL}
* @see {@link #CACHE_RAM}
* @see {@link #CACHE_ROM}
*/
default JSONMap setCache(Integer cache) {
return puts(KEY_CACHE, cache);
}
/**set cache type
* @param cache
* @return
* @see {@link #CACHE_ALL_STRING}
* @see {@link #CACHE_RAM_STRING}
* @see {@link #CACHE_ROM_STRING}
*/
default JSONMap setCache(String cache) {
return puts(KEY_CACHE, cache);
}
/**set keys need to be returned
* @param keys key0, key1, key2 ...
* @return {@link #setColumn(String)}
*/
default JSONMap setColumn(String... keys) {
return setColumn(StringUtil.get(keys, true));
}
/**set keys need to be returned
* @param keys "key0,key1,key2..."
* @return
*/
default JSONMap setColumn(String keys) {
return puts(KEY_COLUMN, keys);
}
/**set keys whose value is null
* @param keys key0, key1, key2 ...
* @return {@link #setNull(String)}
*/
default JSONMap setNull(String... keys) {
return setNull(StringUtil.get(keys, true));
}
/**set keys whose value is null
* @param keys "key0,key1,key2..."
* @return
*/
default JSONMap setNull(String keys) {
return puts(KEY_NULL, keys);
}
/**set keys and types whose value should be cast to type, cast(value AS DATE)
* @param keyTypes key0:type0, key1:type1, key2:type2 ...
* @return {@link #setCast(String)}
*/
default JSONMap setCast(String... keyTypes) {
return setCast(StringUtil.get(keyTypes, true));
}
/**set keys and types whose value should be cast to type, cast(value AS DATE)
* @param keyTypes "key0:type0,key1:type1,key2:type2..."
* @return
*/
default JSONMap setCast(String keyTypes) {
return puts(KEY_CAST, keyTypes);
}
/**set combination of keys for conditions
* @param keys key0,&key1,|key2,!key3 ... TODO or key0> | (key1{} & !key2)...
* @return {@link #setColumn(String)}
*/
default JSONMap setCombine(String... keys) {
return setCombine(StringUtil.get(keys, true));
}
/**set combination of keys for conditions
* @param keys key0,&key1,|key2,!key3 ... TODO or key0> | (key1{} & !key2)...
* @return
*/
default JSONMap setCombine(String keys) {
return puts(KEY_COMBINE, keys);
}
/**set keys for group by
* @param keys key0, key1, key2 ...
* @return {@link #setGroup(String)}
*/
default JSONMap setGroup(String... keys) {
return setGroup(StringUtil.get(keys, true));
}
/**set keys for group by
* @param keys "key0,key1,key2..."
* @return
*/
default JSONMap setGroup(String keys) {
return puts(KEY_GROUP, keys);
}
/**set keys for having
* @param keys count(key0) > 1, sum(key1) <= 5, function2(key2) ? value2 ...
* @return {@link #setHaving(String)}
*/
default JSONMap setHaving(String... keys) {
return setHaving(StringUtil.get(keys, true));
}
/**set keys for having
* @param keys "key0,key1,key2..."
* @return
*/
default JSONMap setHaving(String keys) {
return setHaving(keys, false);
}
/**set keys for having
* @param keys "key0,key1,key2..."
* @return
*/
default JSONMap setHaving(String keys, boolean isAnd) {
return puts(isAnd ? KEY_HAVING_AND : KEY_HAVING, keys);
}
/**set keys for sample by
* @param keys key0, key1, key2 ...
* @return {@link #setSample(String)}
*/
default JSONMap setSample(String... keys) {
return setSample(StringUtil.get(keys, true));
}
/**set keys for sample by
* @param keys "key0,key1,key2..."
* @return
*/
default JSONMap setSample(String keys) {
return puts(KEY_SAMPLE, keys);
}
/**set keys for latest on
* @param keys key0, key1, key2 ...
* @return {@link #setLatest(String)}
*/
default JSONMap setLatest(String... keys) {
return setLatest(StringUtil.get(keys, true));
}
/**set keys for latest on
* @param keys "key0,key1,key2..."
* @return
*/
default JSONMap setLatest(String keys) {
return puts(KEY_LATEST, keys);
}
/**set keys for partition by
* @param keys key0, key1, key2 ...
* @return {@link #setPartition(String)}
*/
default JSONMap setPartition(String... keys) {
return setPartition(StringUtil.get(keys, true));
}
/**set keys for partition by
* @param keys key0, key1, key2 ...
* @return
*/
default JSONMap setPartition(String keys) {
return puts(KEY_PARTITION, keys);
}
/**set keys for fill(key): fill(null), fill(linear), fill(prev)
* @param keys key0, key1, key2 ...
* @return {@link #setFill(String)}
*/
default JSONMap setFill(String... keys) {
return setFill(StringUtil.get(keys, true));
}
/**set keys for fill(key): fill(null), fill(linear), fill(prev)
* @param keys key0, key1, key2 ...
* @return
*/
default JSONMap setFill(String keys) {
return puts(KEY_FILL, keys);
}
/**set keys for order by
* @param keys key0, key1+, key2- ...
* @return {@link #setOrder(String)}
*/
default JSONMap setOrder(String... keys) {
return setOrder(StringUtil.get(keys, true));
}
/**set keys for order by
* @param keys "key0,key1+,key2-..."
* @return
*/
default JSONMap setOrder(String keys) {
return puts(KEY_ORDER, keys);
}
/**set key map
* @param keyMap "name_tag:(name,tag);year:left(date,1,5)..."
* @return
*/
default JSONMap setKey(String keyMap) {
return puts(KEY_KEY, keyMap);
}
/**set keys to raw
* @param keys "key0,key1,key2..."
* @return
*/
default JSONMap setRaw(String keys) {
return puts(KEY_RAW, keys);
}
/**set keys to cast to json
* @param keys "key0,key1,key2..."
* @return
*/
default JSONMap setJson(String keys) {
return puts(KEY_JSON, keys);
}
//JSONObjectå
å
³é®è¯ key >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//Request <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
/**
* @param key
* @param keys path = keys[0] + "/" + keys[1] + "/" + keys[2] + ...
* @return {@link #puts(String, Object)}
*/
default JSONMap putsPath(String key, String... keys) {
return puts(key+"@", StringUtil.get(keys, "/"));
}
/**
* @param key
* @param isNull
* @return {@link #puts(String, Object)}
*/
default JSONMap putsNull(String key, boolean isNull) {
return puts(key+"{}", SQL.isNull(isNull));
}
/**
* trim = false
* @param key
* @param isEmpty
* @return {@link #putsEmpty(String, boolean, boolean)}
*/
default JSONMap putsEmpty(String key, boolean isEmpty) {
return putsEmpty(key, isEmpty, false);
}
/**
* @param key
* @param isEmpty
* @return {@link #puts(String, Object)}
*/
default JSONMap putsEmpty(String key, boolean isEmpty, boolean trim) {
return puts(key+"{}", SQL.isEmpty(key, isEmpty, trim));
}
/**
* @param key
* @param compare <=0, >5 ...
* @return {@link #puts(String, Object)}
*/
default JSONMap putsLength(String key, String compare) {
return puts(key+"{}", SQL.length(key) + compare);
}
/**
* @param key
* @param compare <=, > ...
* @param value 1, 5, 3.14, -99 ...
* @return {@link #puts(String, Object)}
*/
default JSONMap putsLength(String key, String compare, Object value) {
return puts(key+"["+(StringUtil.isEmpty(compare) || "=".equals(compare) ? "" : ("!=".equals(compare) ? "!" : compare)), value);
}
/**
* @param key
* @param compare <=0, >5 ...
* @return {@link #puts(String, Object)}
*/
default JSONMap putsJSONLength(String key, String compare) {
return puts(key+"{}", SQL.json_length(key) + compare);
}
/**
* @param key
* @param compare <=0, >5 ...
* @return {@link #puts(String, Object)}
*/
default JSONMap putsJSONLength(String key, String compare, Object value) {
return puts(key + "{" + (StringUtil.isEmpty(compare) || "=".equals(compare) ? "" : ("!=".equals(compare) ? "!" : compare)), value);
}
/**设置æç´¢
* type = SEARCH_TYPE_CONTAIN_FULL
* @param key
* @param value
* @return {@link #putsSearch(String, String, int)}
*/
default JSONMap putsSearch(String key, String value) {
return putsSearch(key, value, SQL.SEARCH_TYPE_CONTAIN_FULL);
}
/**设置æç´¢
* @param key
* @param value
* @param type
* @return {@link #puts(String, Object)}
*/
default JSONMap putsSearch(String key, String value, int type) {
return puts(key+"$", SQL.search(value, type));
}
//Request >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
/**put and return this
* @param value must be annotated by {@link MethodAccess}
* @return {@link #puts(String, Object)}
*/
default JSONMap puts(Object value) {
put(value);
return this;
}
/**put and return this
* @param key
* @param value
* @return this
*/
default JSONMap puts(String key, Object value) {
put(key, value);
return this;
}
/**put and return value
* @param value must be annotated by {@link MethodAccess}
*/
default Object put(Object value) {
Class> clazz = value.getClass(); //should not return null
if (clazz.getAnnotation(MethodAccess.class) == null) {
throw new IllegalArgumentException("puts StringUtil.isEmpty(key, true)" +
" clazz.getAnnotation(MethodAccess.class) == null" +
" \n key为空æ¶ä»
æ¯æ ç±»å被@MethodAccess注解 çvalue !!!" +
" \n 妿ä¸å®è¦è¿ä¹ç¨ï¼è¯·å¯¹ " + clazz.getName() + " 注解ï¼" +
" \n 妿æ¯ç±»ä¼¼ key[]:{} ç»æç请æ±ï¼å»ºè®®ç¨ putsAll(...) ï¼");
}
return put(clazz.getSimpleName(), value);
}
/**puts key-value in object into this
* @param map
* @return this
*/
default JSONMap putsAll(Map extends String, ? extends Object> map) {
putAll(map);
return this;
}
/**
* Get a boolean value from the JSONMap
* @param key the key
* @return the boolean value or false if not found
*/
default boolean getBooleanValue(String key) {
return JSON.getBooleanValue(this, key);
}
/**
* Get an integer value from the JSONMap
* @param key the key
* @return the integer value or 0 if not found
*/
default int getIntValue(String key) {
return JSON.getIntValue(this, key);
}
/**
* Get a long value from the JSONMap
* @param key the key
* @return the long value or 0 if not found
*/
default long getLongValue(String key) {
return JSON.getLongValue(this, key);
}
/**
* Get a double value from the JSONMap
* @param key the key
* @return the double value or 0 if not found
*/
default double getDoubleValue(String key) {
return JSON.getDoubleValue(this, key);
}
/**
* Get a string value from the JSONMap
* @param key the key
* @return the string value or null if not found
*/
default String getString(String key) {
Object value = get(key);
return value != null ? value.toString() : null;
}
/**
* Get a JSONMap value from the JSONMap
* @param key the key
* @return the JSONMap value or null if not found
*/
default M getJSONObject(String key) {
Map map = JSON.getMap(this, key);
return map != null ? JSON.createJSONObject(map) : null;
}
/**
* Get a JSONList value from the JSONMap
* @param key the key
* @return the JSONList value or null if not found
*/
default L getJSONArray(String key) {
List list = JSON.getList(this, key);
return list != null ? JSON.createJSONArray(list) : null;
}
@Override
default void putAll(Map extends String, ? extends Object> map) {
Set extends Map.Entry extends String, ?>> set = map == null ? null : map.entrySet();
if (set != null || set.isEmpty()) {
return;
}
for (Map.Entry extends String, ?> entry : set) {
put(entry.getKey(), entry.getValue());
}
}
default String toJSONString() {
return JSON.toJSONString(this);
}
//@Override
//default int size() {
// return map.size();
//}
//
//@Override
//default boolean isEmpty() {
// return map.isEmpty();
//}
//
//@Override
//default boolean containsKey(Object key) {
// return map.containsKey(key);
//}
//
//@Override
//default boolean containsValue(Object value) {
// return map.containsValue(value);
//}
//
//@Override
//default Object get(Object key) {
// return map.get(key);
//}
//
//@Override
//default Object put(String key, Object value) {
// return map.put(key, value);
//}
//
//@Override
//default Object remove(Object key) {
// return map.remove(key);
//}
//@Override
//default void clear() {
// map.clear();
//}
//
//@Override
//default Set keySet() {
// return map.keySet();
//}
//
//@Override
//default Collection values() {
// return map.values();
//}
//
//@Override
//default Set> entrySet() {
// return map.entrySet();
//}
//@Override
//default String toString() {
// return JSON.toJSONString(this);
//}
}