当前位置:网站首页>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 :
边栏推荐
- 快过年了,心也懒了
- Aiko ai Frontier promotion (7.6)
- 2022 fields Award Announced! The first Korean Xu Long'er was on the list, and four post-80s women won the prize. Ukrainian female mathematicians became the only two women to win the prize in history
- 【mysql】游标的基本使用
- Swagger UI tutorial API document artifact
- 【力扣刷题】一维动态规划记录(53零钱兑换、300最长递增子序列、53最大子数组和)
- 数据湖(八):Iceberg数据存储格式
- 面试官:Redis中有序集合的内部实现方式是什么?
- Opencv learning example code 3.2.3 image binarization
- 15 millions d'employés sont faciles à gérer et la base de données native du cloud gaussdb rend le Bureau des RH plus efficace
猜你喜欢
监控界的最强王者,没有之一!
【深度学习】PyTorch 1.12发布,正式支持苹果M1芯片GPU加速,修复众多Bug
[redis design and implementation] part I: summary of redis data structure and objects
全网最全的新型数据库、多维表格平台盘点 Notion、FlowUs、Airtable、SeaTable、维格表 Vika、飞书多维表格、黑帕云、织信 Informat、语雀
HMS Core 机器学习服务打造同传翻译新“声”态,AI让国际交流更顺畅
Performance test process and plan
Reference frame generation based on deep learning
【Redis设计与实现】第一部分 :Redis数据结构和对象 总结
968 edit distance
2022菲尔兹奖揭晓!首位韩裔许埈珥上榜,四位80后得奖,乌克兰女数学家成史上唯二获奖女性
随机推荐
Swagger UI教程 API 文档神器
【力扣刷题】32. 最长有效括号
数据湖(八):Iceberg数据存储格式
[redis design and implementation] part I: summary of redis data structure and objects
OneNote 深度评测:使用资源、插件、模版
【论文解读】用于白内障分级/分类的机器学习技术
Reference frame generation based on deep learning
对话阿里巴巴副总裁贾扬清:追求大模型,并不是一件坏事
Introduction to the use of SAP Fiori application index tool and SAP Fiori tools
Tips for web development: skillfully use ThreadLocal to avoid layer by layer value transmission
Web开发小妙招:巧用ThreadLocal规避层层传值
c#使用oracle存储过程获取结果集实例
This year, Jianzhi Tencent
JS操作dom元素(一)——获取DOM节点的六种方式
None of the strongest kings in the monitoring industry!
Seven original sins of embedded development
性能测试过程和计划
Is it profitable to host an Olympic Games?
【Redis设计与实现】第一部分 :Redis数据结构和对象 总结
Word bag model and TF-IDF