Skip to content

Commit 1d0af21

Browse files
author
yindz
authored
Merge pull request #60 from yindz/dev
Dev
2 parents 87304bc + 9f6b12a commit 1d0af21

15 files changed

Lines changed: 628 additions & 25 deletions

pom.xml

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
<groupId>com.apifan.common</groupId>
88
<artifactId>common-random</artifactId>
9-
<version>1.0.15</version>
9+
<version>1.0.16</version>
1010
<packaging>jar</packaging>
1111
<name>common-random</name>
1212
<description>An easy-to-use random data generator.</description>
@@ -23,7 +23,10 @@
2323
<commons-collections.version>4.4</commons-collections.version>
2424
<guava.version>31.1-jre</guava.version>
2525
<jackson-databind.version>2.13.3</jackson-databind.version>
26+
<gson.version>2.9.0</gson.version>
27+
<fastjson.version>1.2.83</fastjson.version>
2628
<tinypinyin.version>2.0.3.RELEASE</tinypinyin.version>
29+
<pinyin4j.version>2.5.1</pinyin4j.version>
2730
<slf4j-api.version>1.7.36</slf4j-api.version>
2831
<slf4j-simple.version>1.7.36</slf4j-simple.version>
2932
<junit.version>4.13.2</junit.version>
@@ -56,16 +59,43 @@
5659
<artifactId>guava</artifactId>
5760
<version>${guava.version}</version>
5861
</dependency>
62+
63+
<!--JSON libraries-->
5964
<dependency>
6065
<groupId>com.fasterxml.jackson.core</groupId>
6166
<artifactId>jackson-databind</artifactId>
6267
<version>${jackson-databind.version}</version>
68+
<optional>true</optional>
69+
</dependency>
70+
<dependency>
71+
<groupId>com.google.code.gson</groupId>
72+
<artifactId>gson</artifactId>
73+
<version>${gson.version}</version>
74+
<optional>true</optional>
75+
</dependency>
76+
<dependency>
77+
<groupId>com.alibaba</groupId>
78+
<artifactId>fastjson</artifactId>
79+
<version>${fastjson.version}</version>
80+
<optional>true</optional>
6381
</dependency>
82+
83+
<!--Chinese pinyin-->
6484
<dependency>
6585
<groupId>io.github.biezhi</groupId>
6686
<artifactId>TinyPinyin</artifactId>
6787
<version>${tinypinyin.version}</version>
88+
<optional>true</optional>
6889
</dependency>
90+
91+
<dependency>
92+
<groupId>com.belerweb</groupId>
93+
<artifactId>pinyin4j</artifactId>
94+
<version>${pinyin4j.version}</version>
95+
<optional>true</optional>
96+
</dependency>
97+
98+
<!--Logs-->
6999
<dependency>
70100
<groupId>org.slf4j</groupId>
71101
<artifactId>slf4j-api</artifactId>

src/main/java/com/apifan/common/random/source/FinancialSource.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,7 @@ public String randomCreditCardNo(CreditCardType type) {
257257
* <p> 特别说明: 不会与现实中的真实借记卡号产生重合 </p>
258258
*
259259
* @return 随机虚拟借记卡号码
260+
* @since 1.0.15
260261
*/
261262
public String randomDebitCardNo() {
262263
//发卡机构标识码9000~9999为目前尚未实际使用的号段(为了避免不必要的麻烦)

src/main/java/com/apifan/common/random/source/OtherSource.java

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,8 @@
33
import com.apifan.common.random.entity.Area;
44
import com.apifan.common.random.entity.EconomicCategory;
55
import com.apifan.common.random.entity.Poem;
6+
import com.apifan.common.random.util.JsonUtils;
67
import com.apifan.common.random.util.ResourceUtils;
7-
import com.fasterxml.jackson.core.JsonProcessingException;
8-
import com.fasterxml.jackson.databind.ObjectMapper;
9-
import com.fasterxml.jackson.databind.type.CollectionType;
108
import com.google.common.base.Joiner;
119
import com.google.common.base.Preconditions;
1210
import com.google.common.collect.Lists;
@@ -198,12 +196,9 @@ private OtherSource() {
198196
astonishingPrefixList = ResourceUtils.base64DecodeLines(ResourceUtils.readLines("astonishing-prefix.txt"));
199197
chineseIdiomsList = ResourceUtils.base64DecodeLines(ResourceUtils.readLines("chinese-idioms.txt"));
200198
englishWordsList = ResourceUtils.readLines("word-en.txt");
201-
202-
ObjectMapper objectMapper = new ObjectMapper();
203-
CollectionType poemType = objectMapper.getTypeFactory().constructCollectionType(List.class, Poem.class);
204199
try {
205-
tangPoemsList = objectMapper.readValue(ResourceUtils.readString("tang-poems.json"), poemType);
206-
} catch (JsonProcessingException e) {
200+
tangPoemsList = JsonUtils.parseObjectList(ResourceUtils.readString("tang-poems.json"), Poem.class);
201+
} catch (Exception e) {
207202
logger.error("初始化数据异常", e);
208203
}
209204
}
@@ -524,6 +519,7 @@ public String randomChineseIdiom() {
524519
*
525520
* @param words 词语数量
526521
* @return 随机英文文本
522+
* @since 1.0.15
527523
*/
528524
public String randomEnglishText(int words) {
529525
Preconditions.checkArgument(words > 1, "词语数量必须大于1");
@@ -534,6 +530,7 @@ public String randomEnglishText(int words) {
534530
* 随机统一社会信用代码(虚拟)
535531
*
536532
* @return 统一社会信用代码(虚拟)
533+
* @since 1.0.15
537534
*/
538535
public String randomSocialCreditCode() {
539536
String prefix = "91";

src/main/java/com/apifan/common/random/source/PersonInfoSource.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
import com.apifan.common.random.constant.CreditCardType;
44
import com.apifan.common.random.constant.RandomConstant;
55
import com.apifan.common.random.entity.IdPrefix;
6+
import com.apifan.common.random.util.PinyinUtils;
67
import com.apifan.common.random.util.ResourceUtils;
7-
import com.github.promeg.pinyinhelper.Pinyin;
88
import com.google.common.base.Joiner;
99
import com.google.common.base.Preconditions;
1010
import com.google.common.base.Splitter;
@@ -296,7 +296,7 @@ public String randomChineseNickName(int maxLength) {
296296
*/
297297
public String randomPinyinNickName(int maxLength) {
298298
String nickName = randomChineseNickName(maxLength);
299-
return Pinyin.toPinyin(nickName, "").toLowerCase();
299+
return PinyinUtils.toPinyin(nickName, true);
300300
}
301301

302302
/**

src/main/java/com/apifan/common/random/util/DataUtils.java

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package com.apifan.common.random.util;
22

33
import com.apifan.common.random.entity.DataField;
4-
import com.fasterxml.jackson.core.JsonProcessingException;
5-
import com.fasterxml.jackson.databind.ObjectMapper;
64
import com.google.common.base.Joiner;
75
import com.google.common.base.Preconditions;
86
import org.apache.commons.collections4.CollectionUtils;
@@ -23,8 +21,6 @@
2321
public class DataUtils {
2422
private static final Logger logger = LoggerFactory.getLogger(DataUtils.class);
2523

26-
private static final ObjectMapper objectMapper = new ObjectMapper();
27-
2824
/**
2925
* 生成JSON
3026
*
@@ -97,7 +93,7 @@ public static String generateCsv(List<DataField> fieldList, int total) {
9793
*/
9894
public static <T> T generateObject(List<DataField> fieldList, Class<T> clazz) throws Exception {
9995
Preconditions.checkArgument(clazz != null, "对象类型为空");
100-
return objectMapper.readValue(generateJson(fieldList), clazz);
96+
return JsonUtils.parseObject(generateJson(fieldList), clazz);
10197
}
10298

10399
/**
@@ -153,8 +149,8 @@ private static String generateJson(List<DataField> fieldList) {
153149
element.put(f.getField(), f.getValueSupplier().get());
154150
});
155151
try {
156-
return objectMapper.writeValueAsString(element);
157-
} catch (JsonProcessingException e) {
152+
return JsonUtils.toJson(element);
153+
} catch (Exception e) {
158154
logger.error("转换JSON字符串时出错", e);
159155
}
160156
return null;
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
package com.apifan.common.random.util;
2+
3+
import com.apifan.common.random.util.json.JsonConverter;
4+
import com.apifan.common.random.util.json.impl.FastjsonConverter;
5+
import com.apifan.common.random.util.json.impl.GsonConverter;
6+
import com.apifan.common.random.util.json.impl.JacksonConverter;
7+
import com.google.common.base.Preconditions;
8+
import org.apache.commons.lang3.StringUtils;
9+
import org.slf4j.Logger;
10+
import org.slf4j.LoggerFactory;
11+
12+
import java.util.List;
13+
import java.util.Map;
14+
15+
/**
16+
* JSON工具类
17+
*
18+
* <p>
19+
* 从 1.0.16 起,不再强依赖 jackson; <br>
20+
* 支持目前常用的以下3种json第三方库: jackson/fastjson/gson <br>
21+
* 检测顺序:jackson>fastjson>gson <br>
22+
* 注意: 不要忘记手动添加依赖
23+
* </p>
24+
*
25+
* @author yin
26+
* @since 1.0.16
27+
*/
28+
public class JsonUtils {
29+
private static final Logger log = LoggerFactory.getLogger(JsonUtils.class);
30+
31+
private static final JsonConverter jsonConverter;
32+
33+
static {
34+
jsonConverter = getRealJsonConverter();
35+
}
36+
37+
/**
38+
* 对象转换为JSON字符串
39+
*
40+
* @param obj 对象
41+
* @return JSON字符串
42+
*/
43+
public static String toJson(Object obj) {
44+
Preconditions.checkNotNull(obj, "对象为空");
45+
return jsonConverter.toJson(obj);
46+
}
47+
48+
/**
49+
* 解析JSON字符串并转换为单个对象
50+
*
51+
* @param text 待解析的JSON字符串
52+
* @param targetClass 目标类
53+
* @param <T> 泛型
54+
* @return 对象
55+
*/
56+
public static <T> T parseObject(String text, Class<T> targetClass) {
57+
Preconditions.checkArgument(StringUtils.isNotBlank(text), "待解析的JSON字符串为空");
58+
Preconditions.checkNotNull(targetClass, "目标类为空");
59+
return jsonConverter.parseObject(text, targetClass);
60+
}
61+
62+
/**
63+
* 解析JSON字符串并转换为对象列表
64+
*
65+
* @param text 待解析的JSON字符串
66+
* @param targetClass 目标类
67+
* @param <T> 泛型
68+
* @return 对象列表
69+
*/
70+
public static <T> List<T> parseObjectList(String text, Class<T> targetClass) {
71+
Preconditions.checkArgument(StringUtils.isNotBlank(text), "待解析的JSON字符串为空");
72+
Preconditions.checkNotNull(targetClass, "目标类为空");
73+
return jsonConverter.parseObjectList(text, targetClass);
74+
}
75+
76+
/**
77+
* 解析JSON字符串并转换为Map列表
78+
*
79+
* @param text 待解析的JSON字符串
80+
* @return Map列表
81+
*/
82+
public static List<Map<String, Object>> parseMapList(String text) {
83+
Preconditions.checkArgument(StringUtils.isNotBlank(text), "待解析的JSON字符串为空");
84+
return jsonConverter.parseMapList(text);
85+
}
86+
87+
/**
88+
* 获取JSON转换器实例
89+
*
90+
* @return JSON转换器实例
91+
*/
92+
private static JsonConverter getRealJsonConverter() {
93+
if (ResourceUtils.isClassLoaded("com.fasterxml.jackson.databind.ObjectMapper")) {
94+
log.info("将使用 jackson");
95+
return new JacksonConverter();
96+
} else if (ResourceUtils.isClassLoaded("com.alibaba.fastjson.JSON")) {
97+
log.info("将使用 fastjson");
98+
return new FastjsonConverter();
99+
} else if (ResourceUtils.isClassLoaded("com.google.gson.Gson")) {
100+
log.info("将使用 gson");
101+
return new GsonConverter();
102+
} else {
103+
throw new RuntimeException("没有找到可用的JSON库");
104+
}
105+
}
106+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package com.apifan.common.random.util;
2+
3+
import com.apifan.common.random.util.pinyin.PinyinConverter;
4+
import com.apifan.common.random.util.pinyin.impl.Pinyin4jConverter;
5+
import com.apifan.common.random.util.pinyin.impl.TinyPinyinConverter;
6+
import org.slf4j.Logger;
7+
import org.slf4j.LoggerFactory;
8+
9+
/**
10+
* 拼音工具类
11+
* <p>
12+
* 从 1.0.16 起,不再强依赖 tinypinyin; <br>
13+
* 支持目前常用的以下2种第三方库: tinypinyin/pinyin4j <br>
14+
* 检测顺序:tinypinyin>pinyin4j <br>
15+
* 注意: 不要忘记手动添加依赖
16+
* </p>
17+
*
18+
* @author yin
19+
* @since 1.0.16
20+
*/
21+
public class PinyinUtils {
22+
private static final Logger log = LoggerFactory.getLogger(PinyinUtils.class);
23+
24+
private static final PinyinConverter pinyinConverter;
25+
26+
static {
27+
pinyinConverter = getRealPinyinConverter();
28+
}
29+
30+
/**
31+
* 转换成拼音
32+
*
33+
* @param src 原始字符串
34+
* @param toLowerCase 是否转换为小写
35+
* @return 拼音
36+
*/
37+
public static String toPinyin(String src, boolean toLowerCase) {
38+
return pinyinConverter.toPinyin(src, toLowerCase);
39+
}
40+
41+
/**
42+
* 获取拼音转换器实例
43+
*
44+
* @return 拼音转换器实例
45+
*/
46+
private static PinyinConverter getRealPinyinConverter() {
47+
if (ResourceUtils.isClassLoaded("com.github.promeg.pinyinhelper.Pinyin")) {
48+
log.info("将使用 tinypinyin");
49+
return new TinyPinyinConverter();
50+
} else if (ResourceUtils.isClassLoaded("net.sourceforge.pinyin4j.PinyinHelper")) {
51+
log.info("将使用 pinyin4j");
52+
return new Pinyin4jConverter();
53+
} else {
54+
throw new RuntimeException("没有找到可用的拼音库");
55+
}
56+
}
57+
}

src/main/java/com/apifan/common/random/util/ResourceUtils.java

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package com.apifan.common.random.util;
22

3-
import com.fasterxml.jackson.databind.ObjectMapper;
4-
import com.fasterxml.jackson.databind.type.CollectionType;
53
import com.google.common.base.Charsets;
64
import com.google.common.base.Preconditions;
75
import com.google.common.collect.Lists;
@@ -62,11 +60,9 @@ public static String readString(String fileName) {
6260
*/
6361
public static List<Map<String, Object>> readAsMapList(String fileName) {
6462
Preconditions.checkArgument(StringUtils.isNotEmpty(fileName), "资源文件名为空");
65-
ObjectMapper objectMapper = new ObjectMapper();
6663
try {
67-
CollectionType collectionType = objectMapper.getTypeFactory().constructCollectionType(List.class, Map.class);
68-
return objectMapper.readValue(readString(fileName), collectionType);
69-
} catch (IOException e) {
64+
return JsonUtils.parseMapList(readString(fileName));
65+
} catch (Exception e) {
7066
logger.error("解析json出现异常", e);
7167
}
7268
return null;
@@ -83,7 +79,7 @@ public static <T> T getRandomElement(List<T> elementList) {
8379
List<T> randomElement = getRandomElement(elementList, 1);
8480
return randomElement.isEmpty() ? null : randomElement.get(0);
8581
}
86-
82+
8783
/**
8884
* 从列表中获取number个随机元素
8985
*
@@ -160,4 +156,23 @@ public static List<String> base64DecodeLines(List<String> lines) {
160156
});
161157
return decoded;
162158
}
159+
160+
/**
161+
* 判断当前运行环境下是否存在某个类
162+
*
163+
* @param clazzName 类名
164+
* @return
165+
*/
166+
public static boolean isClassLoaded(String clazzName) {
167+
if (StringUtils.isBlank(clazzName)) {
168+
return false;
169+
}
170+
try {
171+
Class.forName(clazzName);
172+
return true;
173+
} catch (ClassNotFoundException e) {
174+
logger.warn("未找到类: {}", clazzName);
175+
return false;
176+
}
177+
}
163178
}

0 commit comments

Comments
 (0)