JSON字符串操作
1、創(chuàng)建配置環(huán)境
# 引入測(cè)試包
testImplementation group: 'org.springframework.boot', name: 'spring-boot-starter-test', version: '2.2.6.RELEASE'
# 創(chuàng)建測(cè)試類
@RunWith(SpringRunner.class)
@SpringBootTest
public class JsonTest {
@Test
public void test(){
System.out.println("xxxxxxx");
}
}
-
注意
測(cè)試的時(shí)候需要更改一下idea的設(shè)置
2、FastJson簡(jiǎn)介
# FastJson簡(jiǎn)介
FastJson是將Java對(duì)象轉(zhuǎn)為JSON格式字符串的過(guò)程,JavaBean對(duì)象,List集合對(duì)象,Map集合應(yīng)用最為廣泛。
3、序列化
# Json的數(shù)組形式
jsonStr = ['0','1','2','3',4]
-
測(cè)試
@Test public void test(){ // 創(chuàng)建數(shù)組 String arr [] = {"a", "b", ""}; // 將數(shù)組轉(zhuǎn)為JSON形式 Object json = JSON.toJSON(arr); System.out.println("json = " + json); }
# 序列化:將Java對(duì)象轉(zhuǎn)為JSON字符串的過(guò)程
-
JSON.toJSONString(序列化java對(duì)象)
@Test public void test(){ Student student = new Student(); student.setUserName("范浩然"); student.setAge(12); student.setClassName("初二1班"); // 將javaBean對(duì)象序列化 String studentInfo = JSON.toJSONString(student); System.out.println("studentInfo = " + studentInfo); // 打印對(duì)象信息 System.out.println("student = " + student); }
@Test public void test1(){ Student student = new Student(); student.setUserName("范浩然"); student.setAge(12); student.setClassName("初二1班"); // 序列化集合信息 List<Student> studentList = new ArrayList<>(); studentList.add(student); // 序列化集合信息 String students = JSON.toJSONString(studentList); System.out.println("students = " + students); }
@Test public void test2(){ Student student = new Student(); student.setUserName("范浩然"); student.setAge(12); student.setClassName("初二1班"); HashMap<String, Student> studentMap = new HashMap<>(); studentMap.put("1",student); // 序列化HashMap String studentInfo = JSON.toJSONString(studentMap); System.out.println("studentInfo = " + studentInfo); }
4、反序列化
@Test
public void test3(){
// 反序列化 將Json字符串反序列化為Java對(duì)象
String str = "{\"age\":12,\"className\":\"初二1班\",\"userName\":\"范浩然\"}";
// 第一個(gè)參數(shù) 反序列化的字符串,Java對(duì)象的Class對(duì)象
Student student = JSON.parseObject(str, Student.class);
System.out.println("student = " + student);
// json對(duì)象轉(zhuǎn)為數(shù)組
String str3 = " [{\"age\":12,\"className\":\"初二1班\",\"userName\":\"范浩然\"}]";
List<Student> studentList = JSON.parseArray(str3, Student.class);
studentList.forEach(item ->{
System.out.println(item);
});
// json字符串轉(zhuǎn)為集合 轉(zhuǎn)換后集合泛型的class
String str2 = "{\"1\":{\"age\":12,\"className\":\"初二1班\",\"userName\":\"范浩然\"}}";
// 第一個(gè)參數(shù) 字符串
// 直接進(jìn)行反序列化 Map集合是沒(méi)有泛型的,沒(méi)有泛型的集合是不安全的,轉(zhuǎn)換后的集合必須具有泛型,
// 調(diào)用parseObject傳遞參數(shù),TypeReference類型,在TypeReference類的泛型中,傳遞轉(zhuǎn)后的Map集合
Map<String,Student> map = JSON.parseObject(str2,new TypeReference<Map<String,Student>>(){});
// 遍歷Map
map.entrySet().stream().forEach(item->{
// 遍歷鍵值對(duì)
System.out.println("key:"+item.getKey());
System.out.println("value:"+item.getValue());
});
}
5、枚舉介紹
@Test
public void test4(){
// 枚舉介紹 是進(jìn)行序列化時(shí) 自己可以定義一些特殊的需求
// toJSONString()
// 參數(shù)一:要序列化的對(duì)象
// 參數(shù)二:SerializerFeature枚舉類型的可變參數(shù)
// 常見的方法
// 1.序列化Null值的字段
Student student = new Student();
student.setClassName("高三一班");
student.setBirthday(new Date());
String studentInfo1 = JSON.toJSONString(student);
System.out.println("studentInfo1 = " + studentInfo1);
// 序列化空字段
String studentInfo2 = JSON.toJSONString(student, SerializerFeature.WriteMapNullValue);
System.out.println("studentInfo2 = " + studentInfo2);
// 序列化字段把值序列化為雙引號(hào)
String studentInfo3 = JSON.toJSONString(student, SerializerFeature.WriteNullStringAsEmpty);
System.out.println("studentInfo3 = " + studentInfo3);
// 字段為空的時(shí)候 序列化為0
String studentInfo4 = JSON.toJSONString(student, SerializerFeature.WriteNullNumberAsZero);
System.out.println("studentInfo4 = " + studentInfo4);
// 序列化 布爾值為null 序列化為false
String studentInfo5 = JSON.toJSONString(student, SerializerFeature.WriteNullBooleanAsFalse);
System.out.println("studentInfo5 = " + studentInfo5);
// 序列化日期
String studentInfo6 = JSON.toJSONString(student, SerializerFeature.WriteDateUseDateFormat);
System.out.println("studentInfo6 = " + studentInfo6);
// 格式化字符串可以接收多個(gè)
String s = JSON.toJSONString(student, SerializerFeature.WriteNullNumberAsZero,
SerializerFeature.WriteNullBooleanAsFalse,
SerializerFeature.PrettyFormat);
System.out.println("s = " + s);
}
6、JSONField注解的使用
1、注解
# 若屬性是私有的,必須有set方法,否則無(wú)法序列化、
1.JSONField可以作用于get/set方法上面
2.配置在字段上面
2、作用于字段上面
@JSONField(name = "username")
private String userName;
@Test
public void test5(){
Student student = new Student();
student.setUserName("范浩然");
student.setClassName("高三一班");
String studentInfo = JSON.toJSONString(student);
System.out.println(studentInfo);
}
3、格式化日期時(shí)間
# 使用JSONField格式化日期時(shí)間
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
@Test
public void test6(){
Student student = new Student();
// 賦值時(shí)間數(shù)據(jù)
student.setCreateTime(new Date());
// 轉(zhuǎn)為JSON字符串
String studentInfo = JSON.toJSONString(student);
System.out.println("studentInfo = " + studentInfo);
}
4、指定字段不序列化
# 可以指定某些字段不序列化
1.serialize = false/deserialize
/**
* 指定年齡這個(gè)字段不序列化
*/
@JSONField(serialize = false)
private Integer age;
@Test
public void test7(){
Student student = new Student();
// 雖然給年齡賦值了 但是指定了年齡不序列化 所以結(jié)果中年齡只有姓名
student.setAge(32);
student.setUserName("張三");
String studentInfo = JSON.toJSONString(student);
System.out.println("studentInfo = " + studentInfo);
}
5、指定字段順序
# 可以指定某些字段的一個(gè)序列化的順序
1.ordinal
@JSONField(name = "username",ordinal = 1)
private String userName;
@JSONField(format = "yyyy-MM-dd HH:mm:ss",ordinal = 0)
private Date createTime;
// 首先序列化 創(chuàng)建時(shí)間 在序列化姓名
@Test
public void test8(){
Student student = new Student();
student.setUserName("范浩然");
student.setCreateTime(new Date());
String studentInfo = JSON.toJSONString(student);
System.out.println("studentInfo = " + studentInfo);
}
6、自定義序列化內(nèi)容
# 在fastjson 1.2.16版本之后,JSONField支持新的定制化配置serializeUsing,可以單獨(dú)對(duì)某個(gè)類的某個(gè)屬性定制序列化、反序列化。
指定自定義序列化的內(nèi)容
/**
* 指定自定義序列化字段
*/
@JSONField(serializeUsing = StudentTypeSerializable.class)
private Boolean status;
創(chuàng)建實(shí)現(xiàn)序列化內(nèi)容的類
/**
* @author hrFan
* @version 1.0
* @description: 自定義序列化內(nèi)容
* @date 2022/5/9 星期一
*/
public class StudentTypeSerializable implements ObjectSerializer {
/**
*
* @param serializer 序列化器
* @param object 字段的值
* @param fieldName 字段的名稱
* @param fieldType 字段的類型
* @param features 特征
* @throws IOException
*/
@Override
public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException {
// 獲取字段的值
Boolean isStatus = (Boolean) object;
// 判斷字段的值
String text = "";
if (isStatus = false){
text = "未啟用";
}else {
text = "已啟用";
}
// 進(jìn)行序列化
serializer.write(text);
}
}
測(cè)試
@Test
public void test9(){
Student student = new Student();
// 設(shè)置字段的值
student.setStatus(false);
String studentInfo = JSON.toJSONString(student);
System.out.println("studentInfo = " + studentInfo);
}
7、自定義反序列化內(nèi)容
指定反序列化字段
/**
* 指定自定義序列化字段
*/
@JSONField(deserializeUsing = StudentTypeDeSerializable.class)
private Boolean status;
創(chuàng)建反序列化內(nèi)容的類
/**
* @author hrFan
* @version 1.0
* @description: 自定義序列化內(nèi)容
* @date 2022/5/9 星期一
*/
public class StudentTypeDeSerializable implements ObjectDeserializer {
/**
*
* @param parser Json解析器
* @param type 字段類型
* @param fieldName 字段名稱
* @return 反序列化完成的內(nèi)容
*/
@Override
public Boolean deserialze(DefaultJSONParser parser, Type type, Object fieldName) {
String isUse = "已啟用";
// 獲取反序列化的值
String status = parser.getLexer().stringVal();
Boolean b = false;
if (isUse.equals(status)){
b = true;
}
// 返回字段的類型信息
return b;
}
@Override
public int getFastMatchToken() {
return 0;
}
}
測(cè)試
@Test
public void test10(){
// 自定義序列化的內(nèi)容
String studentInfo = "{\"status\":\"已啟用\"}";
Student student = JSON.parseObject(studentInfo, Student.class);
System.out.println("student = " + student);
}
3、String字符串操作
1、isBlank(判斷字符串是否為空)
# isBlank 空格是非空
1.包含的有空串("")、空白符(空格""," ",制表符"\t",回車符"\r","\n"等)以及null值;
@Test
public void test1(){
// 如果為空 返回true 不為空返回false
System.out.println("空格 : " + StringUtils.isBlank(" "));
System.out.println("字符 : " + StringUtils.isBlank("s"));
System.out.println("制表位 : " + StringUtils.isBlank("\t"));
}
2、remove(移除字符)
# 移除單個(gè)字符,也可以是字符串
StringUtils.remove(String str, char remove)
StringUtils.remove(String str, String remove);
# 移除開頭/結(jié)尾匹配的字符序列
StringUtils.removeStart(String str, String remove);
StringUtils.removeStartIgnoreCase(String str, String remove);
StringUtils.removeEnd(String str, String remove);
StringUtils.removeEndIgnoreCase(String str, String remove);
1、移除單個(gè)字符串
@Test
public void test2(){
String str = "test";
// 第一個(gè)參數(shù) 操作的字符串
// 第二個(gè)參數(shù) 匹配刪除的字符
String afterStr = StringUtils.remove(str, "t");
// 原字符串并不會(huì)被修改
System.out.println("afterStr = " + afterStr);
}
2、移除匹配的字符串
@Test
public void test3(){
String str = "testtesttestest";
// 移除某個(gè)字符串
String afterStr = StringUtils.remove(str, "es");
System.out.println("afterStr = " + afterStr);
}
3、移除首尾匹配的字符串
@Test
public void test4(){
// 移除開頭或者結(jié)尾匹配的字符序列
String str = "ABCDEFG";
String afterStr1 = StringUtils.removeStart(str, "ab");
String afterStr2 = StringUtils.removeEnd(str, "fg");
System.out.println("-------------------------------------------------");
// 刪除忽略大小寫
String afterStr3 = StringUtils.removeStartIgnoreCase(str, "ab");
String afterStr4 = StringUtils.removeEndIgnoreCase(str, "fg");
System.out.println("afterStr1 = " + afterStr1);
System.out.println("afterStr2 = " + afterStr2);
System.out.println("afterStr3 = " + afterStr3);
System.out.println("afterStr4 = " + afterStr4);
}
3、trim(去除首尾空白)
@Test
public void test5(){
String str = " demo ";
System.out.println("str = " + str);
// 去除首尾空白的字符
String afterStr = StringUtils.trim(str);
System.out.println("afterStr = " + afterStr);
}
4、strip(去掉首尾匹配字符)
@Test
public void test6(){
String str = "[demoomed]";
System.out.println("str = " + str);
// 去除首尾的[]
// 應(yīng)用的比較廣泛
String stripStr = StringUtils.strip(str, "[]");
System.out.println("stripStr = " + stripStr);
}
5、replace(替換)
# 注意
若被替換的字符串為null,或者被替換的字符或字符序列為null,又或者替換的字符或字符序列為null
此次替換都會(huì)被忽略,返回原字符串;
# 替換單個(gè)字符或字符序列
replace(String text, String searchString, String replacement);
replace(String text, String searchString, String replacement, int max);max是指替換最大次數(shù),0:不替換,-1:全部替換
replaceChars(String str, char searchChar, char replaceChar);
replaceChars(String str, String searchChars, String replaceChars);
# 只會(huì)替換一次,后面即使匹配也不替換
replaceOnce(String text, String searchString, String replacement);
# 指定位置進(jìn)行字符序列替換,從start索引處開始(包含)到end-1索引處為止進(jìn)行替換
overlay(String str,String overlay,int start,int end);
# 可以同時(shí)替換多個(gè)字符序列,一一對(duì)應(yīng)但被替換和替換的字符序列的個(gè)數(shù)應(yīng)該對(duì)應(yīng),否則會(huì)報(bào)IllegalArgumentException
replaceEach(String text, String[] searchList, String[] replacementList);
StringUtils.replaceEach("test", new String[] { "t", "e" }, new String[] { "T", "E" });
StringUtils.replaceEach("test", null, new String[] { "T", "E" });
test (存在null,不進(jìn)行替換)
# IllegalArgumentException (被替換和替換的個(gè)數(shù)不對(duì)應(yīng))
StringUtils.replaceEach("test", new String[] { "t", "e" }, new String[] { "T", "E", "X" });
# 循環(huán)替換--了解即可
replaceEachRepeatedly(String text, String[] searchList, String[]replacementList);
StringUtils.replaceEachRepeatedly("test", new String[] { "e", "E" }, new String[] { "E", "Y" });
tYst (e被替換為E,E又被替換為Y)
1、(replace)替換單個(gè)字符或者字符序列
@Test
public void test7(){
String str = "abc123abc";
// 第一個(gè)參數(shù) 源字符串 第二個(gè)參數(shù) 需要替換的字符 三個(gè)參數(shù) 需要替換的字符串
// 第四個(gè)參數(shù) max是指替換最大次數(shù),0:不替換,-1:全部替換
String replaceStr1 = StringUtils.replace(str, "abc", "000");
String replaceStr2 = StringUtils.replace(str, "abc", "000",1);
// 當(dāng)max設(shè)置為1時(shí)等價(jià)于只替換一次
String replaceStr3 = StringUtils.replaceOnce(str, "abc", "000");
System.out.println("replaceStr1 = " + replaceStr1);
System.out.println("replaceStr2 = " + replaceStr2);
System.out.println("replaceStr3 = " + replaceStr3);
}
2、(overlay)替換指定位置字符串序列
@Test
public void test8(){
String str = "system is very good";
// 指定位置開始替換 直接替換除了首尾的字符
String afterStr = StringUtils.overlay(str, "--------", 1, str.length()-1);
System.out.println("afterStr = " + afterStr);
}
3、(replaceEach)批量替換
@Test
public void test9(){
String str = "abcdefgabcdefg";
// 替換多個(gè)字符序列
String [] arr1 = { "a", "b"};
String [] arr2 = { "A", "B"};
// 注意 替換的個(gè)數(shù)一定要一致不然報(bào)異常
String afterStr = StringUtils.replaceEach(str, arr1, arr2);
System.out.println("afterStr = " + afterStr);
}
6、(reverse)反轉(zhuǎn)
@Test
public void test10(){
String str1 = "123456789";
String str2 = "1-2-3-4-5-6-7-8-9";
// 字符串反轉(zhuǎn)
String afterStr1 = StringUtils.reverse(str1);
// 根據(jù)分隔符反轉(zhuǎn)
String afterStr2 = StringUtils.reverseDelimited(str2,'-');
System.out.println("afterStr1 = " + afterStr1);
System.out.println("afterStr2 = " + afterStr2);
}
7、(substring)截取
# 截取
1.從左到對(duì)右下標(biāo)默認(rèn)從0開始,從右往左下標(biāo)默認(rèn)從-1開始
@Test
public void test11(){
String str1 = "0123456789";
// 從第五個(gè)位置開始截取
String afterBefore1 = StringUtils.substring(str1, 5);
// 指定截取的開始位置和結(jié)束位置
String afterBefore2 = StringUtils.substring(str1, 0, 5);
System.out.println("afterBefore1 = " + afterBefore1);
System.out.println("afterBefore2 = " + afterBefore2);
}
# 根據(jù)指定的分隔符進(jìn)行截取
# substringAfter
從分隔符第一次出現(xiàn)的位置向后截取
# substringBefore
從分隔符第一次出現(xiàn)的位置向前截取
# substringAfterLast
從分隔符最后一次出現(xiàn)的位置向后截取
# substringBeforeLast
從分隔符最后一次出現(xiàn)的位置向前截取
# substringBetween
截取指定標(biāo)記字符之間的字符序列
@Test
public void test12(){
String str = "ab-cd-ef-gh-ij-kl-mn-op-qr";
// 從分隔符第一次出現(xiàn)的位置向后截取
String afterStr1 = StringUtils.substringAfter(str, "-");
String afterStr2 = StringUtils.substringBefore(str, "-");
System.out.println("afterStr1 = " + afterStr1);
System.out.println("afterStr2 = " + afterStr2);
System.out.println("------------------------------------------------");
// 從分隔符最后一次出現(xiàn)的位置向前或者向后截取
String afterStr3 = StringUtils.substringAfterLast(str, "-");
String afterStr4 = StringUtils.substringBeforeLast(str, "-");
System.out.println("afterStr3 = " + afterStr3);
System.out.println("afterStr4 = " + afterStr4);
System.out.println("------------------------------------------------");
// 截取指定標(biāo)記字符之間的序列
String str2 = "A00000000000000000000000000000000000000A";
String afterStr5 = StringUtils.substringBetween(str2, "A");
System.out.println("afterStr5 = " + afterStr5);
}
8、(containsOnly)包含
# 包含
判斷字符串中的字符是否都是出自所指定的字符數(shù)組或字符串 StringUtils.containsOnly(str, validChars);
需要注意的是:前面的字符是否都出自后面的參數(shù)中,也是拆為數(shù)組來(lái)比較
@Test
public void test13(){
String str = "Happiness is a way station between too much and too little";
// 注意 他是拆分成字符數(shù)組比較的(所以只要有to這個(gè)字符串序列 就會(huì)匹配成功) 注意順序
// 判斷字符序列中是否包含一個(gè)字符或一個(gè)字符序列
// str中是否包含to這個(gè)字符序列
boolean isExistTo1 = StringUtils.containsOnly("to",str);
boolean isExistTo2 = StringUtils.containsOnly("ato",str);
System.out.println("isExistToo1 = " + isExistTo1);
System.out.println("isExistToo2 = " + isExistTo2);
// 用于檢測(cè)字符串是否以指定的前綴開始
boolean isHappinessPrefix = StringUtils.startsWith(str,"Happiness");
System.out.println("isHappinessPrefix = " + isHappinessPrefix);
}
9、(indexOf)查找字符索引
# indexOf
返回在字符串中第一次出現(xiàn)的位置,如果沒(méi)有在字符串中出現(xiàn),則返回-1
# lastIndexOf
返回在字符串中最后一次出現(xiàn)的索引
# indexOfAny
返回字符數(shù)組第一次出現(xiàn)在字符串中的位置
# indexOfAnyBut
子字符串與主字符串不匹配部分的位置
StringUtils.indexOfAnyBut("sdsfhhl0","h");//結(jié)果是0
StringUtils.indexOfAnyBut("sdsfhhl0","s");//結(jié)果是1
StringUtils.indexOfAnyBut("aa","aa");//結(jié)果是-1
# indexOfDifference
統(tǒng)計(jì)兩個(gè)字符串共有的字符個(gè)數(shù)
# difference
去掉兩個(gè)字符串相同的字符以后的字符串
@Test
public void test14(){
String str = "hello,world";
// 查找字符出現(xiàn)的位置
int index1 = StringUtils.indexOf(str, "l");
System.out.println("index1 = " + index1);
// 查找字符最后出現(xiàn)的索引位置
int index2 = StringUtils.lastIndexOf(str,"l");
System.out.println("index2 = " + index2);
// 查找字符串第一次出現(xiàn)的索引的位置
int index3 = StringUtils.indexOfAny(str, "l");
System.out.println("index3 = " + index3);
// 查找字符和字符串不匹配的開始位置
int index4 = StringUtils.indexOfAnyBut(str,"we");
System.out.println("index4 = " + index4);
// 統(tǒng)計(jì)兩個(gè)字符串開始共有的字符個(gè)數(shù)
int number = StringUtils.indexOfDifference(str,"hello");
System.out.println("number = " + number);
// 去除兩個(gè)字符串開始共有的部門
String afterStr = StringUtils.difference(str,"hello,java");
System.out.println("afterStr = " + afterStr);
}
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-833571.html
10、首字母大小寫
# capitalize
首字母大寫
# uncapitalize
首字母小寫
@Test
public void test15(){
String str = "fhr";
System.out.println("str = " + str);
// 首字母變?yōu)榇髮?/span>
String capitalize = StringUtils.capitalize(str);
System.out.println("首字母大寫 = " + capitalize);
// 首字母變?yōu)樾?/span>
String uncapitalize = StringUtils.uncapitalize(capitalize);
System.out.println("首字母小寫 = " + uncapitalize);
// 全部變?yōu)榇髮?/span>
String upperCase = StringUtils.upperCase(capitalize);
System.out.println("全部變?yōu)榇髮?= " + upperCase);
// 全部變?yōu)樾?/span>
String lowerCase = StringUtils.lowerCase(upperCase);
System.out.println("全部變?yōu)樾?= " + lowerCase);
}
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-833571.html
到了這里,關(guān)于String字符串,F(xiàn)astJson常用操作方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!