redis 存入集合物件
阿新 • • 發佈:2018-12-08
package com.gcyh.core.base.cache.redis; import com.gcyh.core.base.log.Log; import com.gcyh.core.base.log.LogFactory; import com.gcyh.core.base.utils.CloseableUtils; import com.gcyh.core.base.utils.MapUtils; import com.gcyh.core.base.utils.SerializeUtils; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; import redis.clients.jedis.*; import java.util.*; /** * jedis工具類 * */ public abstract class JedisUtils { private static Log log = LogFactory.getLog(JedisUtils.class); private static JedisPool pool; private static JedisPoolConfig config; private static JedisShardInfo shardInfo; static { // 初始化池配置 config = new JedisPoolConfig(); config.setMaxTotal(JedisFileConfig.getIntValue("max.total")); config.setMaxIdle(JedisFileConfig.getIntValue("max.idle")); config.setMinIdle(JedisFileConfig.getIntValue("min.idle")); config.setMaxWaitMillis(JedisFileConfig.getIntValue("max.wait.millis")); config.setTestOnBorrow(JedisFileConfig.getBooleanValue("test.on.borrow")); config.setBlockWhenExhausted(JedisFileConfig.getBooleanValue("block.when.exhausted")); // 初始化jedis池 String host = JedisFileConfig.getValue("host"); int port = JedisFileConfig.getIntValue("port"); int timeout = JedisFileConfig.getIntValue("connection.timeout"); String password = JedisFileConfig.getValue("password"); if (StringUtils.isNotBlank(password)) { pool = new JedisPool(config, host, port, timeout, password); } else { pool = new JedisPool(config, host, port, timeout); } // 初始化分片資訊 shardInfo = new JedisShardInfo(host, port); shardInfo.setConnectionTimeout(timeout); if (StringUtils.isNotBlank(password)) { shardInfo.setPassword(password); } shardInfo.setSoTimeout(timeout); } /** * 獲取指定鍵的值 * * @param key 鍵 * @return 鍵值 */ public static String get(String key) { if (StringUtils.isBlank(key)) { return null; } return doExecute(jedis -> jedis.get(key)); } /** * 獲取指定鍵的值 * * @param key 鍵 * @return 值 */ @SuppressWarnings("unchecked") public static <T> T get(byte[] key) { return doExecute(jedis -> { byte[] data = jedis.get(key); return (T) SerializeUtils.unserialize(data); }); } /** * 獲取指定鍵的值 * * @param key 鍵 * @return 值集合 */ public static List<String> lrange(String key) { return lrange(key, 0, -1); } /** * 獲取指定鍵的值 * * @param key 鍵 * @param start 開始索引 * @param end 結束索引 * @return 值集合 */ public static List<String> lrange(String key, long start, long end) { if (StringUtils.isBlank(key)) { return null; } return doExecute(jedis -> jedis.lrange(key, start, end)); } /** * 獲取指定鍵的值 * * @param key 鍵 * @return 值集合 */ public static Set<String> smembers(String key) { if (StringUtils.isBlank(key)) { return null; } return doExecute(jedis -> jedis.smembers(key)); } /** * 獲取指定鍵的值 * * @param key 鍵 * @return 值集合 */ public static List<String> srandmember(String key, int count) { return doExecute(jedis -> jedis.srandmember(key, count)); } /** * 獲取指定鍵的值 * * @param key 鍵 * @return 有序值集合 */ public static Set<String> zrange(String key) { return zrange(key, 0, -1); } /** * 獲取指定鍵的值 * * @param key 鍵 * @param start 開始索引 * @param end 結束索引 * @return 有序值集合 */ public static Set<String> zrange(String key, long start, long end) { if (StringUtils.isBlank(key)) { return null; } return doExecute(jedis -> jedis.zrange(key, start, end)); } /** * 合併多個有序集的值到目標鍵 * * @param destKey 目標鍵 * @param params 合併時的引數 * @param sourceKey 源鍵 * @return 目標鍵中值的數量 */ public static Long zinterstore(String destKey, ZParams params, String... sourceKey) { if (StringUtils.isBlank(destKey)) { return null; } return doExecute(jedis -> jedis.zinterstore(destKey, params, sourceKey)); } /** * 獲取有序集合中元素的倒序 * * @param key 鍵 * @param member 元素 * @return 倒序 */ public static Long zrevrank(String key, String member) { if (StringUtils.isBlank(key) || StringUtils.isBlank(member)) { return null; } return doExecute(jedis -> { Long result = jedis.zrevrank(key, member); return result != null ? result + 1 : null; }); } /** * 按分數倒序獲取快取中的值 * * @param key 鍵 * @return 快取中的值 */ public static Set<SortedSetElement> zrevrangeByScoreWithScores(String key) { if (StringUtils.isBlank(key)) { return null; } return zrevrangeByScoreWithScores(key, Double.MAX_VALUE, Double.MIN_VALUE, 0, -1); } /** * 按分數倒序分頁獲取快取中的值 * * @param key 鍵 * @param offset 起始數 * @param count 獲取的總數 * @return 快取中的值 */ public static Set<SortedSetElement> zrevrangeByScoreWithScores(String key, int offset, int count) { if (StringUtils.isBlank(key)) { return null; } return zrevrangeByScoreWithScores(key, Double.MAX_VALUE, Double.MIN_VALUE, offset, count); } /** * 按分數倒序分頁獲取快取中的值 * * @param key 鍵 * @param max 分數最大值 * @param min 分數最小值 * @param offset 起始數 * @param count 獲取的總數 * @return 快取中的值 */ public static Set<SortedSetElement> zrevrangeByScoreWithScores(String key, Double max, Double min, int offset, int count) { if (StringUtils.isBlank(key)) { return null; } return doExecute(jedis -> { Set<Tuple> set = jedis.zrevrangeByScoreWithScores(key, max, min, offset, count); if (set != null) { Set<SortedSetElement> result = new LinkedHashSet<>(); for (Tuple each : set) { result.add(new SortedSetElement(each.getElement(), each.getScore())); } return result; } return null; }); } /** * 獲取指定鍵的值 * * @param key 鍵 * @return 值map */ public static Map<String, String> hgetAll(String key) { if (StringUtils.isBlank(key)) { return null; } return doExecute(jedis -> jedis.hgetAll(key)); } /** * 獲取指定鍵的值 * * @param key 鍵 * @return 值map */ @SuppressWarnings("unchecked") public static <T> Map<String, T> hgetAll(byte[] key) { if (key == null) { return null; } return doExecute(jedis -> { Map<String, T> result = null; Map<byte[], byte[]> map = jedis.hgetAll(key); if (map != null) { result = new HashMap<>(); for (Map.Entry<byte[], byte[]> entry : map.entrySet()) { result.put(new String(entry.getKey()), (T) SerializeUtils.unserialize(entry.getValue())); } } return result; }); } /** * 獲取指定鍵的值 * * @param key 鍵 * @param field map中的鍵 * @return 值 */ public static String hget(String key, String field) { if (StringUtils.isBlank(key)) { return null; } return doExecute(jedis -> jedis.hget(key, field)); } /** * 獲取指定鍵的值 * * @param key 鍵 * @param field map中的鍵 * @return 值 */ @SuppressWarnings("unchecked") public static <T> T hget(byte[] key, byte[] field) { return doExecute(jedis -> { byte[] result = jedis.hget(key, field); return (T) SerializeUtils.unserialize(result); }); } /** * 獲取指定鍵的值 * * @param key 鍵 * @param field map中的鍵 * @return 值 */ public static List<String> hmget(String key, String... field) { if (StringUtils.isBlank(key)) { return null; } return doExecute(jedis -> jedis.hmget(key, field)); } /** * 是否包含指定的鍵 * * @param key 鍵 * @return 若存在則返回true */ public static Boolean exists(String key) { if (StringUtils.isBlank(key)) { return false; } return doExecute(jedis -> jedis.exists(key)); } /** * 快取指定的鍵值 * * @param key 鍵 * @param value 值 */ public static Boolean set(String key, String value) { if (StringUtils.isBlank(key)) { return false; } return doExecute(jedis -> { String result = jedis.set(key, value); return isSuccess(result); }); } /** * 若指定的鍵不存在時則快取 * <p><b>獲取值時需用getObject方法</b></p> * * @param key 鍵 * @param value 值 * @return 若設定成功則返回true */ public static boolean setObjectIfNotExist(String key, String value) { return setObjectIfNotExist(key, value, -1); } /** * 若指定的鍵不存在時則快取 * <p><b>獲取值時需用getObject方法</b></p> * * @param key 鍵 * @param value 值 * @param milliseconds 快取的時間(單位毫秒) * @return 若設定成功則返回true */ public static boolean setObjectIfNotExist(String key, String value, int milliseconds) { return setObjectIfNotExist(key, (Object) value, milliseconds); } /** * 加鎖 * <p><b>獲取值時需用getObject方法</b></p> * * @param key 鍵 * @param value 值 * @return 若加鎖成功則返回true */ public static boolean lockObject(String key, String value) { return lockObject(key, value, 0); } /** * 加鎖 * <p><b>獲取值時需用getObject方法</b></p> * * @param key 鍵 * @param value 值 * @param milliseconds 快取的時間(單位毫秒) * @return 若加鎖成功則返回true */ public static boolean lockObject(String key, String value, int milliseconds) { if (StringUtils.isBlank(key) || value == null) { return false; } return doExecute(jedis -> { String result; if (milliseconds > 0) { result = jedis.set(key.getBytes(), value.getBytes(), JedisEnum.NXXX.NX.getValue().getBytes(), JedisEnum.EXPX.PX.getValue().getBytes(), milliseconds); } else { result = jedis.set(key.getBytes(), value.getBytes(), JedisEnum.NXXX.NX.getValue().getBytes()); } return isSuccess(result); }); } /** * 解鎖:條件值相等 * * @param key 鍵 * @param value 值 * @return 若解鎖成功則返回true */ public static boolean unlock(String key, String value) { StringBuilder sb = new StringBuilder(); sb.append("if redis.call(\"get\",KEYS[1]) == ARGV[1] then").append(" "); sb.append("return redis.call(\"del\",KEYS[1])").append(" "); sb.append("else").append(" "); sb.append("return 0").append(" "); sb.append("end"); return doExecute(jedis -> (long) jedis.eval(sb.toString(), Collections.singletonList(key), Collections.singletonList(value)) > 0); } /** * 若指定的鍵存在時則快取 * <p><b>獲取值時需用getObject方法</b></p> * * @param key 鍵 * @param value 值 * @return 若設定成功則返回true */ public static boolean setObjectIfExist(String key, String value) { return setObjectIfExist(key, value, 0); } /** * 若指定的鍵存在時則快取 * <p><b>獲取值時需用getObject方法</b></p> * * @param key 鍵 * @param value 值 * @param seconds 快取的時間(單位秒) * @return 若設定成功則返回true */ public static boolean setObjectIfExist(String key, String value, int seconds) { return setObjectIfExist(key, (Object) value, seconds); } /** * 快取指定的鍵值並放在頭部 * * @param key 鍵 * @param value 值 * @return 集合的大小 */ public static Long lpush(String key, String... value) { if (StringUtils.isBlank(key) || ArrayUtils.isEmpty(value)) { return 0L; } return doExecute(jedis -> jedis.lpush(key, value)); } /** * 快取指定的鍵值並放在尾部 * * @param key 鍵 * @param value 值 * @return 集合的大小 */ public static Long rpush(String key, String... value) { if (StringUtils.isBlank(key) || ArrayUtils.isEmpty(value)) { return 0L; } return doExecute(jedis -> jedis.rpush(key, value)); } /** * 從List集合頭部獲取元素並刪除 * * @param key 鍵 * @return list頭部的一個元素 */ public static String lpop(String key) { if (StringUtils.isBlank(key)) { return null; } return doExecute(jedis -> jedis.lpop(key)); } /** * 從List集合中刪除指定的值 * * @param key 鍵 * @param count count > 0 : 從表頭開始向表尾搜尋,移除與 value 相等的元素,數量為 COUNT; * count < 0 : 從表尾開始向表頭搜尋,移除與 value 相等的元素,數量為 COUNT 的絕對值; * count = 0 : 移除表中所有與 VALUE 相等的值。 * @param value 刪除的值 * @return 刪除的元素數量 */ public static Long lrem(String key, long count, String value) { if (StringUtils.isBlank(key)) { return null; } return doExecute(jedis -> jedis.lrem(key, count, value)); } /** * 從List集合尾部獲取元素並刪除 * * @param key 鍵 * @return list尾部的一個元素 */ public static String rpop(String key) { if (StringUtils.isBlank(key)) { return null; } return doExecute(jedis -> jedis.rpop(key)); } /** * 往set快取指定的鍵值 * * @param key 鍵 * @param value 值 * @return 若設定成功則返回true */ public static Boolean sadd(String key, String... value) { if (StringUtils.isBlank(key) || ArrayUtils.isEmpty(value)) { return false; } return doExecute(jedis -> { Long result = jedis.sadd(key, value); return result >= 1; }); } /** * 快取指定的鍵值 * * @param key 鍵 * @param value 值 * @param score 分數 */ public static Boolean zadd(String key, String value, double score) { if (StringUtils.isBlank(key) || value == null) { return false; } return doExecute(jedis -> { Long result = jedis.zadd(key, score, value); return result >= 1; }); } /** * 快取指定的鍵值 * * @param key 鍵 * @param value 格式:{值:分數} */ public static Boolean zadd(String key, Map<String, Double> value) { if (StringUtils.isBlank(key) || MapUtils.isEmpty(value)) { return false; } return doExecute(jedis -> { Long result = jedis.zadd(key, value); return result >= 1; }); } /** * 把sorted set裡指定的成員增加分值 * * @param key 鍵 * @param member 成員 * @param score 分值 * @return 新的分值 */ public static Double zincrby(String key, String member, double score) { if (StringUtils.isBlank(key) || StringUtils.isBlank(member) || score == 0) { return 0D; } return doExecute(jedis -> jedis.zincrby(key, score, member)); } /** * 從sorted set裡刪除元素 * * @param key 鍵 * @param members 刪除的元素 * @return 刪除的數量 */ public static Long zrem(String key, String... members) { if (StringUtils.isBlank(key) || ArrayUtils.isEmpty(members)) { return 0L; } return doExecute(jedis -> jedis.zrem(key, members)); } /** * 快取指定的鍵值 * * @param key 鍵 * @param field map中的鍵 * @param value map中的值 */ public static Boolean hset(String key, String field, String value) { if (StringUtils.isBlank(key) || StringUtils.isBlank(field)) { return false; } return doExecute(jedis -> { Long result = jedis.hset(key, field, value); return result >= 1; }); } /** * 快取指定的鍵值 * * @param key 鍵 * @param field map中的鍵 * @param value map中的值 */ public static Boolean hset(String key, byte[] field, Object value) { if (StringUtils.isBlank(key) || ArrayUtils.isEmpty(field)) { return false; } return doExecute(jedis -> { Long result = jedis.hset(key.getBytes(), field, SerializeUtils.serialize(value)); return result >= 1; }); } /** * 快取指定的鍵值 * <p><b>獲取值時需用getObject方法</b></p> * * @param key 鍵 * @param value 值 */ public static Boolean setObject(String key, Object value) { if (StringUtils.isBlank(key)) { return false; } return doExecute(jedis -> { String result = jedis.set(key.getBytes(), SerializeUtils.serialize(value)); return isSuccess(result); }); } /** * 若指定的鍵不存在時則快取 * <p><b>獲取值時需用getObject方法</b></p> * * @param key 鍵 * @param value 值 * @return 若設定成功則返回true */ public static boolean setObjectIfNotExist(String key, Object value) { return setObjectIfNotExist(key, value, 0); } /** * 若指定的鍵不存在時則快取 * <p><b>獲取值時需用getObject方法</b></p> * * @param key 鍵 * @param value 值 * @param milliseconds 快取的時間(單位毫秒) * @return 若設定成功則返回true */ public static Boolean setObjectIfNotExist(String key, Object value, int milliseconds) { if (StringUtils.isBlank(key)) { return false; } return doExecute(jedis -> { String result; if (milliseconds > 0) { result = jedis.set(key.getBytes(), SerializeUtils.serialize(value), JedisEnum.NXXX.NX.getValue().getBytes(), JedisEnum.EXPX.PX.getValue().getBytes(), milliseconds); } else { result = jedis.set(key.getBytes(), SerializeUtils.serialize(value), JedisEnum.NXXX.NX.getValue().getBytes()); } return isSuccess(result); }); } /** * 若指定的鍵存在時則快取 * <p><b>獲取值時需用getObject方法</b></p> * * @param key 鍵 * @param value 值 * @return 若設定成功則返回true */ public static boolean setObjectIfExist(String key, Object value) { return setObjectIfExist(key, value, 0); } /** * 若指定的鍵存在時則快取 * <p><b>獲取值時需用getObject方法</b></p> * * @param key 鍵 * @param value 值 * @param seconds 快取的時間(單位秒) * @return 若設定成功則返回true */ public static Boolean setObjectIfExist(String key, Object value, int seconds) { if (StringUtils.isBlank(key)) { return false; } return doExecute(jedis -> { String result; if (seconds > 0) { result = jedis.set(key.getBytes(), SerializeUtils.serialize(value), JedisEnum.NXXX.XX.getValue().getBytes(), JedisEnum.EXPX.EX.getValue().getBytes(), seconds); } else { result = jedis.set(key.getBytes(), SerializeUtils.serialize(value), JedisEnum.NXXX.XX.getValue().getBytes()); } return isSuccess(result); }); } /** * 批量快取map中的鍵值 * <p><b>獲取值時需用getObject方法</b></p> * * @param map 鍵值map */ public static <T> void setObject(Map<String, T> map) { if (MapUtils.isEmpty(map)) { return; } doExecute(jedis -> { Pipeline pipeline = jedis.pipelined(); try { for (Map.Entry<String, T> entry : map.entrySet()) { pipeline.set(entry.getKey().getBytes(), SerializeUtils.serialize(entry.getValue())); } pipeline.sync(); } finally { CloseableUtils.close(pipeline); } return null; }); } /** * 增加指定的值 * * @param key 鍵 * @param value 增加的值 * @return 增加後的值 */ public static Long incrBy(String key, int value) { if (StringUtils.isBlank(key) || value == 0) { return 0L; } return doExecute(jedis -> jedis.incrBy(key, value)); } /** * 增加指定的值 * * @param key 鍵 * @param field map中的鍵 * @param value 增加的值 * @return 增加後的值 */ public static Long hincrBy(String key, String field, int value) { if (StringUtils.isBlank(key) || StringUtils.isBlank(field) || value == 0) { return 0L; } return doExecute(jedis -> jedis.hincrBy(key, field, value)); } /** * 減少指定的值 * * @param key 鍵 * @param value 減少的值 * @return 減少後的值 */ public static Long decrBy(String key, long value) { if (StringUtils.isBlank(key) || value == 0) { return 0L; } return doExecute(jedis -> jedis.decrBy(key, value)); } /** * 給指定的鍵設定過期時間 * * @param key 鍵 * @param seconds 過期時間(單位:秒) * @return 若設定成功則返回true */ public static Boolean expire(String key, int seconds) { if (StringUtils.isBlank(key) || seconds <= 0) { return false; } return doExecute(jedis -> { Long result = jedis.expire(key, seconds); return result == 1; }); } /** * 刪除指定的鍵 * * @param key 鍵 * @return 刪除鍵的數量 */ public static Long del(String... key) { if (ArrayUtils.isEmpty(key)) { return 0L; } return doExecute(jedis -> jedis.del(key)); } /** * 刪除map中指定的欄位 * * @param key 鍵 * @param field 欄位 * @return 刪除欄位的數量 */ public static Long hdel(String key, String... field) { if (StringUtils.isBlank(key) || ArrayUtils.isEmpty(field)) { return 0L; } return doExecute(jedis -> jedis.hdel(key, field)); } /** * 獲取以指定格式的鍵 * * @param pattern 正則表示式 * @return 匹配的值 */ public static Set<String> keys(String pattern) { if (StringUtils.isBlank(pattern)) { return null; } return doExecute(jedis -> jedis.keys(pattern)); } /** * 獲取set的大小 * * @param key 鍵 * @return set大小 */ public static Long scard(String key) { if (StringUtils.isBlank(key)) { return 0L; } return doExecute(jedis -> jedis.scard(key)); } /** * 獲取sorted set的大小 * * @param key 鍵 * @return 獲取sorted set大小 */ public static Long zcard(String key) { if (StringUtils.isBlank(key)) { return 0L; } return doExecute(jedis -> jedis.zcard(key)); } /** * 獲取sorted set中指定成員的分數 * * @param key 鍵 * @param member 成員 * @return 指定成員的分數 */ public static Double zscore(String key, String member) { if (StringUtils.isBlank(key)) { return null; } return doExecute(jedis -> jedis.zscore(key, member)); } /** * 校驗set裡是否已存在元素 * * @param key 鍵 * @param member 元素 * @return 若存在則返回true */ public static Boolean sismember(String key, String member) { if (StringUtils.isBlank(key)) { return false; } return doExecute(jedis -> jedis.sismember(key, member)); } /** * 從set裡面刪除元素 * * @param key 鍵 * @param member 元素 * @return 刪除的數量 */ public static Long srem(String key, String... member) { if (StringUtils.isBlank(key) || ArrayUtils.isEmpty(member)) { return 0L; } return doExecute(jedis -> jedis.srem(key, member)); } /** * 返回鍵的過期時間(單位:秒) * * @param key 鍵 * @return 鍵的過期時間 */ public static Long ttl(String key) { if (StringUtils.isBlank(key)) { return null; } return doExecute(jedis -> jedis.ttl(key)); } /** * @return 獲取jedis物件 */ public static Jedis getJedis() { return pool.getResource(); } /** * 清空所有的快取 */ public static void flushDB() { doExecute(jedis -> jedis.flushDB()); } /** * @return 快取池配置 */ public static JedisPoolConfig getConfig() { return config; } /** * @return 分片資訊 */ public static JedisShardInfo getShardInfo() { return shardInfo; } /** * 關閉jedis物件 * * @param jedis jedis物件 */ private static void close(Jedis jedis) { if (jedis != null) { jedis.close(); } } private static boolean isSuccess(String value) { return "OK".equals(value); } private static <T> T doExecute(Executor<T> executor) { Jedis jedis = getJedis(); try { return executor.execute(jedis); } catch (Throwable t) { log.error("快取出現異常", t); return null; } finally { close(jedis); } } private interface Executor<T> { T execute(Jedis jedis); } }
單個物件,可以存入String型別,一組集合,就存入list型別
/** * 新增前臺展示使用者 * * @param userInfo */ private void addShowUser(UserInfo userInfo) { User User = new User(); User.setAvatar(userInfo.getHeadImgUrl()); User.setName(userInfo.getNickName()); User.setStatus(1); User.setUserAccountUuid(userInfo.getId() + ""); Long showUser = JedisUtils.lpush(RedisConstant.USER, GsonUtil.toJson(User)); } //獲取首頁展示的5個使用者 @Override public List<User> getUserList() { List<String> users = JedisUtils.lrange(RedisConstant.USER); List<User> list = new ArrayList<>(); for (String str : users) { User User = GsonUtil.jsonStrToObject(str, User.class); list.add(User); } return list; }
package com.sz.gcyh.crazyad.utils; import com.gcyh.core.base.json.JsonUtils; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.TypeAdapter; import com.google.gson.TypeAdapterFactory; import com.google.gson.internal.bind.DateTypeAdapter; import com.google.gson.reflect.TypeToken; import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonToken; import com.google.gson.stream.JsonWriter; import com.sz.gcyh.crazyad.dto.CrazyAdHomeResDto; import com.sz.gcyh.crazyad.vo.InitvalueJson; import io.netty.util.internal.StringUtil; import java.io.IOException; import java.lang.reflect.Type; import java.util.Date; import java.util.List; import java.util.Map; /** * 處理json字串與物件之間關係的工具類 * */ public final class GsonUtil { private GsonUtil() { } /** * @param obj * @return */ public static String toJson(Object obj) { return toJson(obj, null, false); } /** * @param obj * @param isExportNull * @return */ public static String toJson(Object obj, Boolean isExportNull) { return toJson(obj, null, false, isExportNull); } /** * @param obj * @param datePattern * @return */ public static String toJson(Object obj, String datePattern) { return toJson(obj, datePattern, false); } /** * @param obj * @param datePattern * @param isPrettyPrinting * @return */ public static String toJson(Object obj, String datePattern, Boolean isPrettyPrinting) { return toJson(obj, datePattern, isPrettyPrinting, null); } /** * @param obj * @param datePattern * @param isPrettyPrinting * @param isExportNull * @return */ public static String toJson(Object obj, String datePattern, Boolean isPrettyPrinting, Boolean isExportNull) { GsonBuilder builder = new GsonBuilder(); if (isPrettyPrinting != null && isPrettyPrinting) { builder.setPrettyPrinting(); } if (StringUtil.isNullOrEmpty(datePattern)) { datePattern = "yyyy-MM-dd HH:mm:ss"; } if (isExportNull != null && isExportNull) { builder.serializeNulls(); } builder.disableHtmlEscaping(); builder.setDateFormat(datePattern); Gson gson = builder.create(); return gson.toJson(obj); } /** * 序列化成為字串(空字串轉為 "") * * @param obj 待轉換的物件 * @param datePattern 日期格式,允許空==》預設:yyyy-MM-dd HH:mm:ss * @param isNeedEmptyStr 是否要將null轉換成為空字元 * @return Json資料 */ public static String toJsonWithEmptyStr(Object obj, String datePattern, Boolean isNeedEmptyStr) { GsonBuilder builder = new GsonBuilder(); if (StringUtil.isNullOrEmpty(datePattern)) { datePattern = "yyyy-MM-dd HH:mm:ss"; } if (isNeedEmptyStr != null && isNeedEmptyStr) { builder.registerTypeAdapterFactory(new NullStringToEmptyAdapterFactory<>()); } builder.disableHtmlEscaping(); builder.setDateFormat(datePattern); Gson gson = builder.create(); return gson.toJson(obj); } /** * @param jsonStr * @param clazz * @param <T> * @return */ public static <T> T jsonStrToObject(String jsonStr, Class<T> clazz) { // Gson gson = new GsonBuilder().registerTypeAdapter(Date.class, new DateTypeAdapter()).setDateFormat("yyyy-MM-dd HH:mm:ss").create(); // return gson.fromJson(jsonStr, clazz); T result = JsonUtils.jsonToObject(jsonStr, clazz); return result; } public static void main(String[] args) { String str = "{\n" + " \"name\": \"2018001期\",\n" + " \"beginDate\": \"2018-10-19 02:00:00\",\n" + " \"gameId\": 45,\n" + " \"crazyId\": 43,\n" + " \"adNum\": 200.0,\n" + " \"ad\": 75.0,\n" + " \"gameStatus\": 0\n" + "}"; CrazyAdHomeResDto test = jsonStrToObject(str, CrazyAdHomeResDto.class); System.out.println(test); } /** * 用Type來轉換Json * * @param jsonStr Json字串 * @param type 型別 * @param <T> 返回型別 * @return 資料 */ public static <T> T jsonStrToObjectByType(String jsonStr, Type type) { // Gson gson = new GsonBuilder().registerTypeAdapter(Date.class, new DateTypeAdapter()).setDateFormat("yyyy-MM-dd HH:mm:ss").create(); Gson gson = new GsonBuilder().registerTypeAdapter(Date.class, new DateTypeAdapter()).setDateFormat("yyyy-MM-dd HH:mm:ss:SSS").create(); return gson.fromJson(jsonStr, type); } /** * pretty json string to object,replace null to empty string * * @param jsonStr * @param typeToken * @param <T> * @return */ public static <T> T jsonStrToObjectWithEmptyStr(String jsonStr, TypeToken<T> typeToken) { GsonBuilder builder = new GsonBuilder(); builder.registerTypeAdapter(Date.class, new DateTypeAdapter()).setDateFormat("yyyy-MM-dd HH:mm:ss"); builder.registerTypeAdapter(String.class, new StringNullAdapter()); Gson gson = builder.create(); return gson.fromJson(jsonStr, typeToken.getType()); } /** * 轉化Json成為Map<String, Object> * * @param json 待轉化的Json * @return Map型別的結果 */ public static Map<String, Object> parse2Map(String json) { Type stringStringMap = new TypeToken<Map<String, Object>>() { }.getType(); Gson gson = new Gson(); Map<String, Object> map = gson.fromJson(json, stringStringMap); return map; } /** * 轉化Json成為Map<String, String> * * @param json 待轉化的Json * @return Map型別的結果 */ public static Map<String, String> parse2Mapstr(String json) { Type stringStringMap = new TypeToken<Map<String, String>>() { }.getType(); Gson gson = new Gson(); Map<String, String> map = gson.fromJson(json, stringStringMap); return map; } /** * 轉化Json成為List * * @param json 待轉化的Json * @return List型別的結果 */ public static List<InitvalueJson> parseInitvalue(String json) { Gson gson = new Gson(); List<InitvalueJson> list = gson.fromJson(json, new TypeToken<List<InitvalueJson>>() { }.getType()); return list; } } class NullStringToEmptyAdapterFactory<T> implements TypeAdapterFactory { @SuppressWarnings("unchecked") @Override public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) { Class<T> rawType = (Class<T>) type.getRawType(); if (rawType != String.class) { return null; } return (TypeAdapter<T>) new StringNullAdapter(); } } class StringNullAdapter extends TypeAdapter<String> { @Override public String read(JsonReader reader) throws IOException { if (reader.peek() == JsonToken.NULL) { reader.nextNull(); return ""; } return reader.nextString(); } @Override public void write(JsonWriter writer, String value) throws IOException { if (value == null) { writer.nullValue(); return; } writer.value(value); } }