yObject類包含常見基礎類型字段和子類SubObject,SubObject包含LocalDateTime、LocalDate字段,模擬從前端接收到json字符串,然后轉為對象,再把對象轉為字符串。
之前有粉絲問我類里面包含內部類如何反序列化,所以這個例子也為了給粉絲一個參考。
代碼片段如下,需要整個代碼的請到gitee下載,文章中的測試類路徑:src/test/java/com/javalaoniu/tool/JacksonMapperTest.java
@Test
public void demoTest() {
JacksonMapper instance=JacksonMapper.getInstance();
JacksonMapper jacksonMapper=JacksonMapper.nonDefaultMapper();
System.out.println(instance==jacksonMapper);
String s="{\n" +
" \"serviceUuid\": \"9430be4f4cb244d79a5c0bf5e77136dc\", \n" +
" \"secretId\": \"dsvb942f67c43cb475\", \n" +
" \"nonceStr\": \"90907e\", \n" +
" \"sign\": \"6071BF709864F21AB1B218F3122358B4\", \n" +
" \"pageIndex\": 1, \n" +
" \"pageSize\": 100, \n" +
" \"customParams\": {\n" +
" \"startTime\": \"2019-11-19 14:42:47\",\n" +
" \"endDate\": \"2019-11-20\",\n" +
" \"itemCodes\": \"90000700100754196914440306,90000600100754196914440309,90000800100754196914440306," +
"90000700100754196914440342\"\n" +
" }\n" +
"}";
MyObject myObject=JacksonMapper.fromJsonString(s, MyObject.class);
logger.info(myObject.toString());
String json=instance.toJson(myObject);
logger.info(json);
}
實體類
/**
* 靜態內部類,jackson解析內部類時需要static修飾,否則需要把類單獨放到java文件中
*
* @JsonFormat 來自定義時間格式
* @JsonIgnore可以忽略某個 Java 對象中的屬性,它將不參與 JSON 的序列化與反序列化
* @JsonGetter可以在對 Java 對象進行 JSON 序列化時自定義屬性名稱
* @JsonSetter可以在對 JSON 進行反序列化時設置 JSON 中的 key 與 Java 屬性的映射關系
*/
static class MyObject {
private String serviceUuid;
private String secretId;
private String nonceStr;
private String sign;
private Integer pageIndex;
private Integer pageSize;
private SubObject customParams;
。。。。。get/set等代碼
}
/**
* 靜態內部類,jackson解析內部類時需要static修飾,否則需要把類單獨放到java文件中
*
* @JsonSerialize 指定序列化使用的類
* @JsonDeserialize 指定反序列化使用的類
*/
static class SubObject {
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
@JsonDeserialize(using=LocalDateTimeDeserializer.class)
@JsonSerialize(using=LocalDateTimeSerializer.class)
private LocalDateTime startTime;
@JsonFormat(pattern="yyyy-MM-dd")
@JsonDeserialize(using=LocalDateDeserializer.class)
@JsonSerialize(using=LocalDateSerializer.class)
private LocalDate endDate;
private String itemCodes;
。。。。。get/set等代碼
}
jackson工具類
package com.javalaoniu.tool.utils;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser.Feature;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.util.JSONPObject;
import com.fasterxml.jackson.module.jaxb.JaxbAnnotationModule;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.util.TimeZone;
/**
* 簡單封裝Jackson,實現JSON String<->Java Object的Mapper.
* 封裝不同的輸出風格, 使用不同的builder函數創建實例.
*/
public class JacksonMapper extends ObjectMapper {
private static final long serialVersionUID=1L;
private static Logger logger=LoggerFactory.getLogger(JacksonMapper.class);
private static JacksonMapper mapper;
private JacksonMapper() {
this(Include.NON_EMPTY);
}
private JacksonMapper(Include include) {
// 設置輸出時包含屬性的風格
if (include !=null) {
this.setSerializationInclusion(include);
}
// 允許單引號、允許不帶引號的字段名稱
this.enableSimple();
// 設置輸入時忽略在JSON字符串中存在但Java對象實際沒有的屬性
this.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
// 運行empty的屬性
this.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
// 空值處理為空串
this.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>(){
@Override
public void serialize(Object value, JsonGenerator jgen,
SerializerProvider provider) throws IOException,
JsonProcessingException {
jgen.writeString("");
}
});
//this.registerModule(new SimpleModule().addSerializer(new MyBigDecimalDesirializer()));
// 進行HTML解碼。
/*this.registerModule(new SimpleModule().addSerializer(String.class, new JsonSerializer<String>(){
@Override
public void serialize(String value, JsonGenerator jgen,
SerializerProvider provider) throws IOException,
JsonProcessingException {
jgen.writeString(StringEscapeUtils.unescapeHtml4(value));
}
})); */
// 設置時區
this.setTimeZone(TimeZone.getDefault());//getTimeZone("GMT+8:00")
}
/**
* 設定是否使用Enum的toString函數來讀寫Enum,
* 為False時使用Enum的name()函數來 讀寫Enum, 默認為False.
* 注意本函數一定要在Mapper創建后, 所有的讀寫動作之前調用.
*/
public JacksonMapper enableEnumUseToString() {
this.enable(SerializationFeature.WRITE_ENUMS_USING_TO_STRING);
this.enable(DeserializationFeature.READ_ENUMS_USING_TO_STRING);
return this;
}
/**
* 支持使用Jaxb的Annotation,使得POJO上的annotation不用與Jackson耦合。
* 默認會先查找jaxb的annotation,如果找不到再找jackson的。
*/
public JacksonMapper enableJaxbAnnotation() {
JaxbAnnotationModule module=new JaxbAnnotationModule();
this.registerModule(module);
return this;
}
/**
* 允許單引號
* 允許不帶引號的字段名稱
*/
public JacksonMapper enableSimple() {
this.configure(Feature.ALLOW_SINGLE_QUOTES, true);
this.configure(Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
this.configure(SerializationFeature.WRITE_BIGDECIMAL_AS_PLAIN,true);
return this;
}
/**
* 取出Mapper做進一步的設置或使用其他序列化API.
*/
public ObjectMapper getMapper() {
return this;
}
/**
* Object可以是POJO,也可以是Collection或數組。
* 如果對象為Null, 返回"null".
* 如果集合為空集合, 返回"[]".
*/
public String toJson(Object object) {
try {
return this.writeValueAsString(object);
} catch (IOException e) {
logger.warn("write to json string error:" + object, e);
return null;
}
}
/**
* 反序列化POJO或簡單Collection如List<String>.
*
* 如果JSON字符串為Null或"null"字符串, 返回Null.
* 如果JSON字符串為"[]", 返回空集合.
*
* 如需反序列化復雜Collection如List<MyBean>, 請使用fromJson(String,JavaType)
* @see #fromJson(String, JavaType)
*/
public <T> T fromJson(String jsonString, Class<T> clazz) {
if (jsonString==null || jsonString.isEmpty()) {
return null;
}
try {
return this.readValue(jsonString, clazz);
} catch (IOException e) {
logger.warn("parse json string error:" + jsonString, e);
return null;
}
}
/**
* 反序列化復雜Collection如List<Bean>, 先使用函數createCollectionType構造類型,然后調用本函數.
* @see #createCollectionType(Class, Class...)
*/
@SuppressWarnings("unchecked")
public <T> T fromJson(String jsonString, JavaType javaType) {
if (jsonString==null || jsonString.isEmpty()) {
return null;
}
try {
return (T) this.readValue(jsonString, javaType);
} catch (IOException e) {
logger.warn("parse json string error:" + jsonString, e);
return null;
}
}
/**
* 構造泛型的Collection Type如:
* ArrayList<MyBean>, 則調用constructCollectionType(ArrayList.class,MyBean.class)
* HashMap<String,MyBean>, 則調用(HashMap.class,String.class, MyBean.class)
*/
public JavaType createCollectionType(Class<?> collectionClass, Class<?>... elementClasses) {
return this.getTypeFactory().constructParametricType(collectionClass, elementClasses);
}
/**
* 當JSON里只含有Bean的部分屬性時,更新一個已存在Bean,只覆蓋該部分的屬性.
*/
@SuppressWarnings("unchecked")
public <T> T update(String jsonString, T object) {
try {
return (T) this.readerForUpdating(object).readValue(jsonString);
} catch (JsonProcessingException e) {
logger.warn("update json string:" + jsonString + " to object:" + object + " error.", e);
} catch (IOException e) {
logger.warn("update json string:" + jsonString + " to object:" + object + " error.", e);
}
return null;
}
/**
* 輸出JSONP格式數據.
*/
public String toJsonP(String functionName, Object object) {
return toJson(new JSONPObject(functionName, object));
}
/**
* 創建只輸出非Null且非Empty(如List.isEmpty)的屬性到Json字符串的Mapper,建議在外部接口中使用.
*/
public static JacksonMapper getInstance() {
if (mapper==null){
mapper=new JacksonMapper(Include.ALWAYS).enableSimple();
}
return mapper;
}
/**
* 創建只輸出初始值被改變的屬性到Json字符串的Mapper, 最節約的存儲方式,建議在內部接口中使用。
*/
public static JacksonMapper nonDefaultMapper() {
if (mapper==null){
mapper=new JacksonMapper(Include.NON_DEFAULT);
}
return mapper;
}
/**
* 封裝這個方法便于直接類名調用
* 對象轉換為JSON字符串
* @param object
* @return
*/
public static String toJsonString(Object object){
return JacksonMapper.getInstance().toJson(object);
}
/**
* 封裝這個方法便于直接類名調用
* JSON字符串轉換為對象
* @param jsonString
* @param clazz
* @return
*/
public static <T> T fromJsonString(String jsonString, Class<T> clazz){
return JacksonMapper.getInstance().fromJson(jsonString, clazz);
}
}
maven依賴
靈魂拷問1:還在為新項目工具類搬遷而煩惱?
靈魂拷問2:還在為項目中工具類維護而煩惱?
Hutool它是一個Java工具集類庫,包含了很多靜態方法的封裝:流處理、時間日期處理、正則處理、加解密處理、文件處理、集合處理等,可以說是項目中幾乎所有XxxxUtil的替代品,它可以使你更多的關注代碼邏輯,優雅的寫出高效代碼,避免“復制粘貼,改改再戰”。
模塊劃分預覽,可以根據需求對每個模塊單獨引入,也可以通過引入hutool-all方式引入所有模塊。
模塊 | 介紹 |
hutool-aop | JDK動態代理封裝,提供非IOC下的切面支持 |
hutool-bloomFilter | 布隆過濾,提供一些Hash算法的布隆過濾 |
hutool-cache | 簡單緩存實現 |
hutool-core | 核心,包括Bean操作、日期、各種Util等 |
hutool-cron | 定時任務模塊,提供類Crontab表達式的定時任務 |
hutool-crypto | 加密解密模塊,提供對稱、非對稱和摘要算法封裝 |
hutool-db | JDBC封裝后的數據操作,基于ActiveRecord思想 |
hutool-dfa | 基于DFA模型的多關鍵字查找 |
hutool-extra | 擴展模塊,對第三方封裝(模板引擎、郵件、Servlet、二維碼、Emoji、FTP、分詞等) |
hutool-http | 基于HttpUrlConnection的Http客戶端封裝 |
hutool-log | 自動識別日志實現的日志門面 |
hutool-script | 腳本執行封裝,例如Javascript |
hutool-setting | 功能更強大的Setting配置文件和Properties封裝 |
hutool-system | 系統參數調用封裝(JVM信息等) |
hutool-json | JSON實現 |
hutool-captcha | 圖片驗證碼實現 |
hutool-poi | 針對POI中Excel和Word的封裝 |
hutool-socket | 基于Java的NIO和AIO的Socket封裝 |
hutool-jwt | JSON Web Token (JWT)封裝實現 |
??只列舉部分方法,詳細可查看源碼學習!!!
日期轉換再常用不過了,字符串轉日期格式、日期格式轉指定字符串格式、獲取當前系統日期、時間差
// 自定義日期格式轉化
String dateStr="2017-03-01";
Date date=DateUtil.parse(dateStr, "yyyy-MM-dd");
提供了生肖、天干地支、傳統節日等方法。
//通過公歷構建
ChineseDate date=new ChineseDate(DateUtil.parseDate("2020-01-25"));
// 一月
date.getChineseMonth();
// 正月
date.getChineseMonthName();
// 初一
date.getChineseDay();
// 庚子
date.getCyclical();
// 生肖:鼠
date.getChineseZodiac();
// 傳統節日(部分支持,逗號分隔):春節
date.getFestivals();
// 庚子鼠年 正月初一
date.toString();
計算方法或過程執行的時間,支持分組計時,方便對比時間
TimeInterval timer=DateUtil.timer();
//---------------------------------
//-------這是執行過程
//---------------------------------
timer.interval();//花費毫秒數
timer.intervalRestart();//返回花費時間,并重置開始時間
timer.intervalMinute();//花費分鐘數
在文件上傳時,有時候我們需要判斷文件類型。但是又不能簡單的通過擴展名來判斷(防止惡意腳本等通過上傳到服務器上),于是我們需要在服務端通過讀取文件的首部幾個二進制位來判斷常用的文件類型。
File file=FileUtil.file("d:/test.jpg");
String type=FileTypeUtil.getType(file);
//輸出 jpg則說明確實為jpg文件
Console.log(type);
這個工具的用處類似于Apache Commons Lang中的StringUtil,字符串判空操作就不再累述,StrUtil只做增強:sub、removePrefix、removeSuffix
// 去掉字符串的后綴,例如去個文件名的擴展名。
String fileName=StrUtil.removeSuffix("pretty_girl.jpg", ".jpg") //fileName -> pretty_girl
16進制一般針對無法顯示的一些二進制進行顯示,常用于: 1、圖片的字符串表現形式 2、加密解密 3、編碼轉換
String str="我是一個字符串";
String hex=HexUtil.encodeHexStr(str, CharsetUtil.CHARSET_UTF_8);
//hex是:
//e68891e698afe4b880e4b8aae5ad97e7aca6e4b8b2
String decodedStr=HexUtil.decodeHexStr(hex);
//解碼后與str相同
轉義和反轉義工具類Escape / Unescape。escape采用ISO Latin字符集對指定的字符串進行編碼。所有的空格符、標點符號、特殊字符以及其他非ASCII字符都將被轉化成%xx格式的字符編碼(xx等于該字符在字符集表里面的編碼的16進制數字)。此類中的方法對應Javascript中的escape()函數和unescape()函數。
URL(Uniform Resource Locator)中文名為統一資源定位符,有時也被俗稱為網頁地址。表示為互聯網上的資源,如網頁或者FTP地址。在Java中,也可以使用URL表示Classpath中的資源(Resource)地址。
?URLUtil.normalize 標準化化URL鏈接。對于不帶http://頭的地址做簡單補全。
String url="http://www.hutool.cn//aaa/bbb";
// 結果為:http://www.hutool.cn/aaa/bbb
String normalize=URLUtil.normalize(url);
url="http://www.hutool.cn//aaa/\\bbb?a=1&b=2";
// 結果為:http://www.hutool.cn/aaa/bbb?a=1&b=2
normalize=URLUtil.normalize(url);
?URLUtil.encode 封裝URLEncoder.encode,將需要轉換的內容(ASCII碼形式之外的內容),用十六進制表示法轉換出來,并在之前加上%開頭。
String body="366466 - 副本.jpg";
// 結果為:366466%20-%20%E5%89%AF%E6%9C%AC.jpg
String encode=URLUtil.encode(body);
枚舉(enum)算一種“語法糖”,是指一個經過排序的、被打包成一個單一實體的項列表。一個枚舉的實例可以使用枚舉項列表中任意單一項的值。枚舉在各個語言當中都有著廣泛的應用,通常用來表示諸如顏色、方式、類別、狀態等等數目有限、形式離散、表達又極為明確的量。Java從JDK5開始,引入了對枚舉的支持。
//定義枚舉
public enum TestEnum{
TEST1("type1"), TEST2("type2"), TEST3("type3");
private TestEnum(String type) {
this.type=type;
}
private String type;
public String getType() {
return this.type;
}
}
// 獲取枚舉類中所有枚舉對象的name列表
List<String> names=EnumUtil.getNames(TestEnum.class); //結果:[TEST1, TEST2, TEST3]
// 獲得枚舉類中各枚舉對象下指定字段的值
List<Object> types=EnumUtil.getFieldValues(TestEnum.class, "type"); //結果:[type1, type2, type3]
數字工具針對數學運算做工具性封裝
// 格式化為指定字符串
long c=299792458;//光速
String format=NumberUtil.decimalFormat(",###", c);//299,792,458
數組工具類主要針對原始類型數組和泛型數組相關方案進行封裝
// 數組判空
int[] a={};
int[] b=null;
ArrayUtil.isEmpty(a);
ArrayUtil.isEmpty(b);
RandomUtil主要針對JDK中Random對象做封裝,嚴格來說,Java產生的隨機數都是偽隨機數,因此Hutool封裝后產生的隨機結果也是偽隨機結果。不過這種隨機結果對于大多數情況已經夠用。
// 例如我們想產生一個[10, 100)的隨機數,則:
int c=RandomUtil.randomInt(10, 100);
在分布式環境中,唯一ID生成應用十分廣泛,生成方法也多種多樣,Hutool針對一些常用生成策略做了簡單封裝。包括UUID、ObjectId(MongoDB)、Snowflake(Twitter)
// 生成的UUID是帶-的字符串,類似于:a5c8a5e8-df2b-4706-bea4-08d0939410e3
String uuid=IdUtil.randomUUID();
// 生成的是不帶-的字符串,類似于:b17f24ff026d40949c85a24f4f375d42
String simpleUUID=IdUtil.simpleUUID();
在文本處理中,正則表達式幾乎是全能的,但是Java的正則表達式有時候處理一些事情還是有些繁瑣
// 給定字符串是否匹配給定正則
String content="ZZZaaabbbccc中文1234";
boolean isMatch=ReUtil.isMatch("\\w+[\u4E00-\u9FFF]+\\d+", content);
Assert.assertTrue(isMatch);
支持大陸15位、18位身份證,港澳臺10位身份證
String ID_18="321083197812162119";
String ID_15="150102880730303";
//是否有效
boolean valid=IdcardUtil.isValidCard(ID_18);
boolean valid15=IdcardUtil.isValidCard(ID_15);
//轉換
String convert15To18=IdcardUtil.convert15To18(ID_15);
//年齡
DateTime date=DateUtil.parse("2017-04-10");
int age=IdcardUtil.getAgeByIdCard(ID_18, date);
int age2=IdcardUtil.getAgeByIdCard(ID_15, date);
//生日
String birth=IdcardUtil.getBirthByIdCard(ID_18);
String birth2=IdcardUtil.getBirthByIdCard(ID_15);
//省份
String province=IdcardUtil.getProvinceByIdCard(ID_18);
String province2=IdcardUtil.getProvinceByIdCard(ID_15);
在數據處理或清洗中,可能涉及到很多隱私信息的脫敏工作,因此Hutool針對常用的信息封裝了一些脫敏方法。
// 以身份證號碼為例:5***************1X
DesensitizedUtil.idCardNum("51343620000320711X", 1, 2);
法人和其他組織統一社會信用代碼制度,相當于讓法人和其他組織擁有了一個全國統一的“身份證號”,由一下五部分組成: 第一部分:登記管理部門代碼1位 (數字或大寫英文字母) 第二部分:機構類別代碼1位 (數字或大寫英文字母) 第三部分:登記管理機關行政區劃碼6位 (數字) 第四部分:主體標識碼(組織機構代碼)9位 (數字或大寫英文字母) 第五部分:校驗碼1位 (數字或大寫英文字母)
// 校驗是否為社會信用代碼
String testCreditCode="91310110666007217T";
// true
CreditCodeUtil.isCreditCode(testCreditCode);
驗證給定字符串是否滿足指定條件,一般用在表單字段驗證里。
// 驗證是否為郵箱
boolean isEmail=Validator.isEmail("loolly@gmail.com")
// 如無法滿足需求,可通過該正則驗證
Validator.isMactchRegex("需要驗證字段的正則表達式", "被驗證內容")
Bean工具類主要是針對這些setXXX和getXXX方法進行操作,比如將Bean對象轉為Map等等
// 使用Map填充bean
HashMap<String, Object> map=CollUtil.newHashMap();
map.put("name", "Joe");
map.put("age", 12);
map.put("openId", "DFDFSDFWERWER");
SubPerson person=BeanUtil.fillBeanWithMap(map, new SubPerson(), false);
這個工具主要增加了對數組、集合類的操作。
// 將集合轉換為字符串
String[] col=new String[]{"a","b","c","d","e"};
List<String> colList=CollUtil.newArrayList(col);
String str=CollUtil.join(colList, "#"); //str -> a#b#c#d#e
List在集合中中使用最為頻繁,因此新版本的Hutool中針對List單獨封裝了工具方法。
// 列表截取
final List<Integer> of=ListUtil.of(1, 2, 3, 4);
// [3, 4]
final List<Integer> sub=ListUtil.sub(of, 2, 4);
// 對子列表操作不影響原列表
sub.remove(0);
此工具主要針對類似于\u4e2d\u6587這類Unicode字符做一些特殊轉換。
// 字符串轉Unicode 第二個參數true表示跳過ASCII字符(只跳過可見字符)
String s=UnicodeUtil.toUnicode("aaa123中文", true); //結果aaa123\\u4e2d\\u6587
// Unicode轉字符串
String res=UnicodeUtil.toString("aaa\\U4e2d\\u6587\\u111\\urtyu\\u0026"); //結果aaa中文\\u111\\urtyu&
MapUtil是針對Map的一一列工具方法的封裝,包括getXXX的快捷值轉換方法。
// reverse Map的鍵和值互換
Map<String, String> map=MapUtil.newHashMap();
map.put("a", "1");
map.put("b", "2");
map.put("c", "3");
map.put("d", "4");
Map<String, String> map2=MapUtil.reverse(map);
結果為:
{
"1": "a",
"2": "b",
"3": "c",
"4": "d",
}
Base64編碼是用64(2的6次方)個ASCII字符來表示256(2的8次方)個ASCII字符,也就是三位二進制數組經過編碼后變為四位的ASCII字符顯示,長度比原來增加1/3。
String a="倫家是一個非常長的字符串";
// 5Lym5a625piv5LiA5Liq6Z2e5bi46ZW/55qE5a2X56ym5Liy
String encode=Base64.encode(a);
// 還原為a
String decodeStr=Base64.decodeStr(encode);
此工具是NumberUtil的一個補充,NumberUtil偏向于簡單數學計算的封裝,MathUtil偏向復雜數學計算。
針對awt中圖片處理進行封裝,這些封裝包括:縮放、裁剪、轉為黑白、加水印等操作。
// 圖片類型轉換png->jpg
ImgUtil.convert(FileUtil.file("e:/test2.png"), FileUtil.file("e:/test2Convert.jpg"));
// 彩色轉黑白
ImgUtil.gray(FileUtil.file("d:/logo.png"), FileUtil.file("d:/result.png"));
// 添加文字水印
ImgUtil.pressText(
FileUtil.file("e:/pic/face.jpg"),
FileUtil.file("e:/pic/test2_result.png"),
"版權所有", Color.WHITE, //文字
new Font("黑體", Font.BOLD, 100), //字體
0, //x坐標修正值。 默認在中間,偏移量相對于中間偏移
0, //y坐標修正值。 默認在中間,偏移量相對于中間偏移
0.8f//透明度:alpha 必須是范圍 [0.0, 1.0] 之內(包含邊界值)的一個浮點數字
);
在日常開發中,網絡連接這塊兒必不可少。日常用到的一些功能,隱藏掉部分IP地址、絕對相對路徑的轉換等等。
String ip="127.0.0.1";
long iplong=2130706433L;
// 根據long值獲取ip v4地址
String ip=NetUtil.longToIpv4(iplong);
// 根據ip地址計算出long型的數據
long ip=NetUtil.ipv4ToLong(ip);
// 檢測本地端口可用性
boolean result=NetUtil.isUsableLocalPort(6379);
// 是否為有效的端口
boolean result=NetUtil.isValidPort(6379);
// 隱藏掉IP地址
String result=NetUtil.hideIpPart(ip);
針對JSONObject和JSONArray的靜態快捷方法集合
// JSON字符串解析
String html="{\"name\":\"Something must have been changed since you leave\"}";
JSONObject jsonObject=JSONUtil.parseObj(html);
jsonObject.getStr("name");
// XML字符串轉JSON
String s="<sfzh>123</sfzh><sfz>456</sfz><name>aa</name><gender>1</gender>";
JSONObject json=JSONUtil.parseFromXml(s);
json.get("sfzh");
json.get("name");
// JSON轉XML
final JSONObject put=JSONUtil.createObj().set("aaa", "你好").set("鍵2", "test");
// <aaa>你好</aaa><鍵2>test</鍵2>
final String s=JSONUtil.toXmlStr(put);
// JSON轉Bean
String json="{\"ADT\":[[{\"BookingCode\":[\"N\",\"N\"]}]]}";
Price price=JSONUtil.toBean(json, Price.class);
price.getADT().get(0).get(0).getBookingCode().get(0);
SecureUtil主要針對常用加密算法構建快捷方式,還有提供一些密鑰生成的快捷工具方法。
// AES對稱加解密
String content="test中文";
// 隨機生成密鑰
byte[] key=SecureUtil.generateKey(SymmetricAlgorithm.AES.getValue()).getEncoded();
// 構建
AES aes=SecureUtil.aes(key);
// 加密
byte[] encrypt=aes.encrypt(content);
// 解密
byte[] decrypt=aes.decrypt(encrypt);
// 加密為16進制表示
String encryptHex=aes.encryptHex(content);
// 解密為字符串
String decryptStr=aes.decryptStr(encryptHex, CharsetUtil.CHARSET_UTF_8);
基于JDK的HttpUrlConnection封裝完成,完整支持https、代理和文件上傳、以及URL參數編解碼等。
GET請求栗子:
// 最簡單的HTTP請求,可以自動通過header等信息判斷編碼,不區分HTTP和HTTPS
String result1=HttpUtil.get("https://www.baidu.com");
// 當無法識別頁面編碼的時候,可以自定義請求頁面的編碼
String result2=HttpUtil.get("https://www.baidu.com", CharsetUtil.CHARSET_UTF_8);
//可以單獨傳入http參數,這樣參數會自動做URL編碼,拼接在URL中
HashMap<String, Object> paramMap=new HashMap<>();
paramMap.put("city", "北京");
String result3=HttpUtil.get("https://www.baidu.com", paramMap);
POST請求栗子:
HashMap<String, Object> paramMap=new HashMap<>();
paramMap.put("city", "北京");
String result=HttpUtil.post("https://www.baidu.com", paramMap);
文件上傳栗子:
HashMap<String, Object> paramMap=new HashMap<>();
//文件上傳只需將參數中的鍵指定(默認file),值設為文件對象即可,對于使用者來說,文件上傳與普通表單提交并無區別
paramMap.put("file", FileUtil.file("D:\\face.jpg"));
String result=HttpUtil.post("https://www.baidu.com", paramMap);
如我們在使用爬蟲爬取HTML頁面后,需要對返回頁面的HTML內容做一定處理,比如去掉指定標簽(例如廣告欄等)、去除JS、去掉樣式等等,這些操作都可以使用HtmlUtil完成。
// 轉義HTML特殊字符
String html="<html><body>123'123'</body></html>";
// 結果為:<html><body>123'123'</body></html>
String escape=HtmlUtil.escape(html);
// 還原被轉義的HTML特殊字符
String escape="<html><body>123'123'</body></html>";
// 結果為:<html><body>123'123'</body></html>
String unescape=HtmlUtil.unescape(escape);
// 清除指定HTML標簽和被標簽包圍的內容
String str="pre<img src=\"xxx/dfdsfds/test.jpg\">";
// 結果為:pre
String result=HtmlUtil.removeHtmlTag(str, "img");
// 清除所有HTML標簽,但是保留標簽內的內容
String str="pre<div class=\"test_div\">\r\n\t\tdfdsfdsfdsf\r\n</div><div class=\"test_div\">BBBB</div>";
// 結果為:pre\r\n\t\tdfdsfdsfdsf\r\nBBBB
String result=HtmlUtil.cleanHtmlTag(str);
// 清除指定HTML標簽,不包括內容
String str="pre<div class=\"test_div\">abc</div>";
// 結果為:preabc
String result=HtmlUtil.unwrapHtmlTag(str, "div");
// 過濾HTML文本,防止XSS攻擊
String html="<alert></alert>";
// 結果為:""
String filter=HtmlUtil.filter(html);
引入拼音庫(TinyPinyin、JPinyin、Pinyin4j)其中任意一個引擎,從而實現獲取漢語拼音、拼音首字母
// 獲取拼音:"ni hao"
String pinyin=PinyinUtil.getPinyin("你好", " ");
// 獲取拼音首字母:"h, s, d, y, g"
String result=PinyinUtil.getFirstLetter("H是第一個", ", ");
引入表情依賴,實現表情轉義、表情轉html、轉義的別名轉表情
<!-- 表情依賴 -->
<dependency>
<groupId>com.vdurmont</groupId>
<artifactId>emoji-java</artifactId>
<version>4.0.0</version>
</dependency>
// 轉義Emoji字符
String alias=EmojiUtil.toAlias("");//:smile:
// 將轉義的別名轉為Emoji字符
String emoji=EmojiUtil.toUnicode(":smile:");//
// 將字符串中的Unicode Emoji字符轉換為HTML表現形式
String alias=EmojiUtil.toHtml("");//
引入zxing庫依賴(理論上你引入的版本應與此版本一致或比這個版本新),實現二維碼的生成(二維碼可附帶logo圖標)以及識別二維碼
<!-- zxing庫依賴 -->
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.3.3</version>
</dependency>
// 自定義參數生成指定url對應的二維碼到文件
QrConfig config=new QrConfig(300, 300);
// 設置邊距,既二維碼和背景之間的邊距
config.setMargin(3);
// 設置前景色,既二維碼顏色(青色)
config.setForeColor(Color.CYAN.getRGB());
// 設置背景色(灰色)
config.setBackColor(Color.GRAY.getRGB());
// 生成二維碼到文件,也可以到流
QrCodeUtil.generate("http://hutool.cn/", config, FileUtil.file("e:/qrcode.jpg"));
// 識別二維碼(decode -> "http://hutool.cn/" )
String decode=QrCodeUtil.decode(FileUtil.file("d:/qrcode.jpg"));
Hutool對所有第三方都是可選依賴,因此在使用MailUtil時需要自行引入第三方依賴。支持群發、帶附件、自定義郵件服務器
<!-- java-mail依賴 -->
<!-- 說明 com.sun.mail是javax.mail升級后的版本,新版本包名做了變更。 -->
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.2</version>
</dependency>
// 發送普通文本郵件,最后一個參數可選是否添加多個附件
MailUtil.send("hutool@foxmail.com", "測試", "郵件來自Hutool測試", false);
// 發送HTML格式的郵件并附帶附件,最后一個參數可選是否添加多個附件:
MailUtil.send("hutool@foxmail.com", "測試", "<h1>郵件來自Hutool測試</h1>", true, FileUtil.file("d:/aaa.xml"));
// 群發郵件,可選HTML或普通文本,可選多個附件:
ArrayList<String> tos=CollUtil.newArrayList(
"person1@bbb.com",
"person2@bbb.com",
"person3@bbb.com",
"person4@bbb.com");
MailUtil.send(tos, "測試", "郵件來自Hutool群發測試", false);
官方文檔: https://www.hutool.cn/docs/#/
Github地址: https://github.com/dromara/hutool
Gitee地址: https://gitee.com/dromara/hutool
作者:京東零售 馬宏偉
來源:京東云開發者社區 轉載請注明來源
scape() 和 unescape() 是 JavaScript 中的兩個函數,用于編碼和解碼字符串。
escape() 函數用于對字符串進行編碼,將字符串中的特殊字符轉換為十六進制轉義序列。這些特殊字符包括非字母數字字符、保留字符和其他特殊字符。例如,空格字符會被轉換為 %20。
示例:
var str="Hello, World!";
var encodedStr=escape(str);
console.log(encodedStr); // 輸出:Hello%2C%20World%21
在上述示例中,escape() 函數將字符串 "Hello, World!" 編碼為 "Hello%2C%20World%21"。
unescape() 函數用于對字符串進行解碼,將被 escape() 編碼的字符串恢復為原始字符串。
示例:
var encodedStr="Hello%2C%20World%21";
var decodedStr=unescape(encodedStr);
console.log(decodedStr); // 輸出:Hello, World!
在上述示例中,unescape() 函數將編碼后的字符串 "Hello%2C%20World%21" 解碼為原始字符串 "Hello, World!"。
推薦使用更安全和可靠的編碼和解碼函數,例如encodeURI()、encodeURIComponent()、decodeURI() 和 decodeURIComponent()。
使用這些新的函數會更好地處理特殊字符和 Unicode 字符。
例如,encodeURI() 和 encodeURIComponent() 在編碼 URL 時通常更合適,而 decodeURI() 和 decodeURIComponent()在解碼 URL 時更合適。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。