当前位置:网站首页>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 :
边栏推荐
- SDL2来源分析7:演出(SDL_RenderPresent())
- 字符串的使用方法之startwith()-以XX开头、endsWith()-以XX结尾、trim()-删除两端空格
- Aiko ai Frontier promotion (7.6)
- Laravel笔记-自定义登录中新增登录5次失败锁账户功能(提高系统安全性)
- Opencv learning example code 3.2.3 image binarization
- Le langage r visualise les relations entre plus de deux variables de classification (catégories), crée des plots Mosaiques en utilisant la fonction Mosaic dans le paquet VCD, et visualise les relation
- FZU 1686 龙之谜 重复覆盖
- 'class file has wrong version 52.0, should be 50.0' - class file has wrong version 52.0, should be 50.0
- 038. (2.7) less anxiety
- Tips for web development: skillfully use ThreadLocal to avoid layer by layer value transmission
猜你喜欢
愛可可AI前沿推介(7.6)
PHP saves session data to MySQL database
监控界的最强王者,没有之一!
基于STM32单片机设计的红外测温仪(带人脸检测)
20220211 failure - maximum amount of data supported by mongodb
3D face reconstruction: from basic knowledge to recognition / reconstruction methods!
Reference frame generation based on deep learning
性能测试过程和计划
【mysql】游标的基本使用
HMS core machine learning service creates a new "sound" state of simultaneous interpreting translation, and AI makes international exchanges smoother
随机推荐
[sliding window] group B of the 9th Landbridge cup provincial tournament: log statistics
OSPF多区域配置
@GetMapping、@PostMapping 和 @RequestMapping详细区别附实战代码(全)
New database, multidimensional table platform inventory note, flowus, airtable, seatable, Vig table Vika, Feishu multidimensional table, heipayun, Zhixin information, YuQue
el-table表格——获取单击的是第几行和第几列 & 表格排序之el-table与sort-change、el-table-column与sort-method & 清除排序-clearSort
R语言可视化两个以上的分类(类别)变量之间的关系、使用vcd包中的Mosaic函数创建马赛克图( Mosaic plots)、分别可视化两个、三个、四个分类变量的关系的马赛克图
【Redis设计与实现】第一部分 :Redis数据结构和对象 总结
039. (2.8) thoughts in the ward
966 minimum path sum
Data Lake (VIII): Iceberg data storage format
20220211 failure - maximum amount of data supported by mongodb
【OpenCV 例程200篇】220.对图像进行马赛克处理
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
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
嵌入式开发的7大原罪
SAP Fiori应用索引大全工具和 SAP Fiori Tools 的使用介绍
Regular expression collection
监控界的最强王者,没有之一!
过程化sql在定义变量上与c语言中的变量定义有什么区别
【深度学习】PyTorch 1.12发布,正式支持苹果M1芯片GPU加速,修复众多Bug