当前位置:网站首页>Fastjson parses JSON strings (deserialized to list, map)
Fastjson parses JSON strings (deserialized to list, map)
2022-07-06 21:16:00 【I hope to wake up naturally every day】
List of articles
When dealing with database in daily development , Often with Json Format string stored in the database , When in Java Get the corresponding Json Format String After the string , How to convert to the data format we want ( Like converting to Java Custom classes in ), You need to make the right Json Data analysis , The interface I recently wrote meets such a demand , I use Ali's Fastjson api Realization json Turn into Java POJO, Now let's make a simple summary , Make a note of .
To configure maven rely on
Introduce three dependencies respectively , Namely fastjson、lombok、commons tool kit .
<dependencies>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.78</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
<scope>compile</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
</dependencies>
I have written the version number , Please use a specific version if necessary , It is recommended to use the latest version of .
Data preparation
Let's simply construct a little data , Requirements for data analysis : Whole json Turn into a POJO, among code、name The type is String,schedule The type is List<String> Represents the plan list ,completion The type is Map<String,String> It means that the completion is mapped one by one .
Build Monday to Sunday plan & completion Of json data :
[
{
"code":"monday",
"name":" Monday ",
"schedule":"get_up_9am,exercise_one_hour,study_one_hour,goto_bed_before_12pm",
"completion":"get_up_9am=y,exercise_one_hour=n,study_one_hour=y,goto_bed_before_12pm=n"
},{
"code":"tuesday",
"name":" Tuesday ",
"schedule":"exercise_one_hour,study_one_hour,goto_bed_before_12pm",
"completion":"exercise_one_hour=y,study_one_hour=y,goto_bed_before_12pm=y"
},{
"code":"wednesday",
"name":" Wednesday ",
"schedule":"get_up_9am,exercise_one_hour,goto_bed_before_12pm",
"completion":"get_up_9am=n,exercise_one_hour=n,goto_bed_before_12pm=n"
},{
"code":"thursday",
"name":" Thursday ",
"schedule":"",
"completion":""
},{
"code":"friday",
"name":" Friday ",
"schedule":"study_one_hour,goto_bed_before_12pm",
"completion":"study_one_hour=n,goto_bed_before_12pm=n"
},{
"code":"saturday",
"name":" Saturday ",
"schedule":"goto_bed_before_12pm",
"completion":"goto_bed_before_12pm=n"
},{
"code":"sunday",
"name":" Sunday ",
"schedule":"",
"completion":""
}
]
JSON Format string to Java object
The following is the direct post code
DO&DTO
DO It's all for String Data of type ,DTO It's one of them schedule by List,completion by Map Format
WeekScheduleDO
package com.xxx;
import lombok.Data;
@Data
public class WeekScheduleDO {
private String code;
private String name;
private String schedule;
private String completion;
}
WeekScheduleDTO
package com.fast;
import lombok.Data;
import java.util.List;
import java.util.Map;
@Data
public class WeekScheduleDTO {
private String code;
private String name;
private List<String> schedule;
private Map<String,String> completion;
}
SelfJSONUtils
Customize and encapsulate the methods needed for parsing
package com.xxx;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import org.apache.commons.lang3.StringUtils;
import java.util.*;
import java.util.stream.Collectors;
public class SelfJSONUtils {
public static List<WeekScheduleDTO> toWeekScheduleDOs(String str){
// String->List<WeekScheduleDO>
List<WeekScheduleDO> weekScheduleDOs = JSON.parseObject(str, new TypeReference<List<WeekScheduleDO>>() {
});
List<WeekScheduleDTO> result = new ArrayList<>();
for (WeekScheduleDO item:weekScheduleDOs) {
result.add(toWeekScheduleDTO(item));
}
return result;
}
private static WeekScheduleDTO toWeekScheduleDTO(WeekScheduleDO item){
WeekScheduleDTO weekScheduleDTO = new WeekScheduleDTO();
weekScheduleDTO.setCode(item.getCode());
weekScheduleDTO.setName(item.getName());
// "schedule":"get_up_9am,..." convert to lsit
String[] schedule = item.getSchedule().split(",");
weekScheduleDTO.setSchedule(Arrays.stream(schedule).filter(e -> StringUtils.isNoneBlank(e)).collect(Collectors.toList()));
// "completion":"get_up_9am=y,..." convert to map
weekScheduleDTO.setCompletion(toMap(item.getCompletion().split(",")));
return weekScheduleDTO;
}
private static Map<String,String> toMap(String[] args){
Map<String,String> map = new HashMap<>();
for(String arg : args){
if(!arg.isEmpty()) {
String[] split1 = arg.split("=");
map.put(split1[0], split1[1]);
}
}
return map;
}
}
test & call
package com.xxx;
import java.util.List;
public class Demo {
public static void main(String[] args) {
String json = "[{\"code\":\"monday\",\"name\":\" Monday \",\"schedule\":\"get_up_9am,exercise_one_hour,study_one_hour,goto_bed_before_12pm\",\"completion\":\"get_up_9am=y,exercise_one_hour=n,study_one_hour=y,goto_bed_before_12pm=n\"},{\"code\":\"tuesday\",\"name\":\" Tuesday \",\"schedule\":\"exercise_one_hour,study_one_hour,goto_bed_before_12pm\",\"completion\":\"exercise_one_hour=y,study_one_hour=y,goto_bed_before_12pm=y\"},{\"code\":\"wednesday\",\"name\":\" Wednesday \",\"schedule\":\"get_up_9am,exercise_one_hour,goto_bed_before_12pm\",\"completion\":\"get_up_9am=n,exercise_one_hour=n,goto_bed_before_12pm=n\"},{\"code\":\"thursday\",\"name\":\" Thursday \",\"schedule\":\"\",\"completion\":\"\"},{\"code\":\"friday\",\"name\":\" Friday \",\"schedule\":\"study_one_hour,goto_bed_before_12pm\",\"completion\":\"study_one_hour=n,goto_bed_before_12pm=n\"},{\"code\":\"saturday\",\"name\":\" Saturday \",\"schedule\":\"goto_bed_before_12pm\",\"completion\":\"goto_bed_before_12pm=n\"},{\"code\":\"sunday\",\"name\":\" Sunday \",\"schedule\":\"\",\"completion\":\"\"}]";
List<WeekScheduleDTO> weekScheduleDTOS = SelfJSONUtils.toWeekScheduleDOs(json);
System.out.println(weekScheduleDTOS);
}
}
Now you can run directly or debug View the resolution

This requirement should be considered as a conventional complex situation , If there are more complicated situations , The transformation form can also be adjusted according to the gourd and the gourd ~
Points of attention
If you're careful , You will find that there is a redundant operation in my code , It is located in SelfJSONUtils#toBatchItemDTO Converted to List Over there Stream Flow place :
weekScheduleDTO.setSchedule(Arrays.stream(schedule).filter(e -> StringUtils.isNoneBlank(e)).collect(Collectors.toList()));
fastjson When you switch , The default is null We're going to get rid of the data ( Optional ), According to this characteristic , I just use the following code ( No, filter):
weekScheduleDTO.setSchedule(Arrays.stream(schedule).collect(Collectors.toList()));
Not really filter(e -> StringUtils.isNoneBlank(e)) You can't . In the code map When you switch , It's really the elimination of empty data , turn map After coming out, I did size=0( Here's the picture ), In turn List When , If there is no empty data , The data will be in "" The form is stored in List in ( I've been in this hole for a long time !!)

Except for the above StringUtils#isNoneBlank Except empty , You can also use e.hashCode()!=0 To solve , Of course, this is not StringUtils Strategies to use when available
weekScheduleDTO.setSchedule(Arrays.stream(schedule).filter(e -> e.hashCode()!=0).collect(Collectors.toList()));
Simply analyze the reasons for this situation :
fastjosn analysis josn by POJO When , First we'll create a pojo An empty object , Then, through the entity class set Method to assign a value to a parameter , because fastjson When parsing, it defaults to null The data of is eliminated , therefore fastjson If the field is not reserved, it will not be set operation , and pojo Class is not assigned by anyone from beginning to end , As String The default type is "", And in the conversion to List When , It will be directly stored in a ""(List<String> Can store multiple "").
This problem may not be big , But when business needs cannot be implemented according to our ideas because of this small point , It's hard to find this tiny problem .
in addition ,JSON The data is deserialized to Java Object time , Must have a default parameterless constructor , Otherwise, the following exceptions will be reported
com.alibaba.fastjson.JSONException: default constructor not found.
Fastjson API
Fastjson Be recognized as Java And json The fastest interactive Library ! Take a brief look at Fastjson Of api Design , For serialization and serialization json There are many optional operations for data , such as @JSONField 、BeanToArray、ContextValueFilter To configure JSON transformation 、NameFilter and SerializeConfig wait . For specific use, please refer to the official API that will do .
Reference resources :
边栏推荐
- 【OpenCV 例程200篇】220.对图像进行马赛克处理
- Pinduoduo lost the lawsuit, and the case of bargain price difference of 0.9% was sentenced; Wechat internal test, the same mobile phone number can register two account functions; 2022 fields Awards an
- 966 minimum path sum
- 防火墙基础之外网服务器区部署和双机热备
- The difference between break and continue in the for loop -- break completely end the loop & continue terminate this loop
- 每个程序员必须掌握的常用英语词汇(建议收藏)
- 对话阿里巴巴副总裁贾扬清:追求大模型,并不是一件坏事
- After working for 5 years, this experience is left when you reach P7. You have helped your friends get 10 offers
- 【力扣刷题】32. 最长有效括号
- 'class file has wrong version 52.0, should be 50.0' - class file has wrong version 52.0, should be 50.0
猜你喜欢

ICML 2022 | Flowformer: 任务通用的线性复杂度Transformer

967- letter combination of telephone number

新型数据库、多维表格平台盘点 Notion、FlowUs、Airtable、SeaTable、维格表 Vika、飞书多维表格、黑帕云、织信 Informat、语雀

【mysql】触发器

Aiko ai Frontier promotion (7.6)

请问sql group by 语句问题

OneNote 深度评测:使用资源、插件、模版

for循环中break与continue的区别——break-完全结束循环 & continue-终止本次循环

KDD 2022 | realize unified conversational recommendation through knowledge enhanced prompt learning

【力扣刷题】一维动态规划记录(53零钱兑换、300最长递增子序列、53最大子数组和)
随机推荐
Notes - detailed steps of training, testing and verification of yolo-v4-tiny source code
Nodejs教程之Expressjs一篇文章快速入门
15million employees are easy to manage, and the cloud native database gaussdb makes HR office more efficient
Huawei device command
Interviewer: what is the internal implementation of ordered collection in redis?
JS operation DOM element (I) -- six ways to obtain DOM nodes
The most comprehensive new database in the whole network, multidimensional table platform inventory note, flowus, airtable, seatable, Vig table Vika, flying Book Multidimensional table, heipayun, Zhix
如何实现常见框架
Select data Column subset in table R [duplicate] - select subset of columns in data table R [duplicate]
OSPF多区域配置
MLP (multilayer perceptron neural network) is a multilayer fully connected neural network model.
【力扣刷题】一维动态规划记录(53零钱兑换、300最长递增子序列、53最大子数组和)
The difference between break and continue in the for loop -- break completely end the loop & continue terminate this loop
Three schemes of SVM to realize multi classification
SAP UI5 框架的 manifest.json
每个程序员必须掌握的常用英语词汇(建议收藏)
全网最全的知识库管理工具综合评测和推荐:FlowUs、Baklib、简道云、ONES Wiki 、PingCode、Seed、MeBox、亿方云、智米云、搜阅云、天翎
968 edit distance
@PathVariable
Aiko ai Frontier promotion (7.6)