? 优质资源分享 ?
学习路线指引(点击解锁) | 知识定位 | 人群定位 |
---|---|---|
? Python实战微信订餐小程序 ? | 进阶级 | 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。 |
?Python量化交易实战? | 入门级 | 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统 |
Json格式在后台服务中的重要性就不多说了,直入正题。首先引入pom文件,这里使用的是1.2.83版本
1 <dependency>
2 <groupId>com.alibabagroupId>
3 <artifactId>fastjsonartifactId>
4 <version>1.2.83version>
5 dependency>
接着我们尝试验证两种场景1、Model对象转Json字符串2、Json字符串转Model对象在验证之前我们需要先编写一个model类,这个model类的字段我们可以使用fastJson中的注解@JSONField来修饰,并添加name值。这个注解的作用,将该model类的字段和对应的json对象的key相对应起来。(防盗连接:本文首发自https://blog.csdn.net/jilodream/ )当然你也可以不添加该注解,这样就相当于使用了字段名称本身与json对象的key建立映射。为了尽可能的展示各种场景,我在下边的model 示例中,使用了好几种场景1、注解的name值与字段值相同2、注解的name值与字段值不同3、不设置注解4、作用在复杂引用类型上5、作用在基本类型上7、作用在容器上
如图
1 @Data
2 public class ProjectModel {
3 @JSONField(name = "projectName")
4 private String projectName;
5 @JSONField(name = "projectId")
6 private int id;
7 private List userIdList;
8 @JSONField(name = "userBeanList")
9 private List userList;
10 @JSONField(name = "adminUser")
11 private User adminUser;
12
13 @Data
14 public static class User {
15 @JSONField(name = "user-id")
16 private String userId;
17 private String user\_Name;
18 }
19 }
接下来我们开始验证:场景一、Model对象转Json字符串
1 @PostConstruct
2 public void handleConvertJson() {
3 ProjectModel projectModel= createProjectModel();
4 String projectJson = JSON.toJSONString(projectModel);
5 System.out.println(projectJson);
6 }
7
8
9 private ProjectModel createProjectModel() {
10 ProjectModel projectModel = new ProjectModel();
11 projectModel.setId(999);
12 projectModel.setProjectName("p-1");
13 List userIdList = new ArrayList<>();
14 userIdList.add("3");
15 userIdList.add("2");
16 userIdList.add("1");
17 projectModel.setUserIdList(userIdList);
18
19 ProjectModel.User adminUser=new ProjectModel.User();
20 adminUser.setUser\_Name("admin");
21 adminUser.setUserId("0");
22 projectModel.setAdminUser(adminUser);
23
24 List userList = new ArrayList<>();
25 ProjectModel.User user3 = new ProjectModel.User();
26 user3.setUserId("3");
27 user3.setUser\_Name("name3");
28 userList.add(user3);
29 ProjectModel.User user2 = new ProjectModel.User();
30 user2.setUserId("2");
31 user2.setUser\_Name("name2");
32 userList.add(user2);
33 projectModel.setUserList(userList);
34 return projectModel;
35 }
执行结果格式化后如下
1 {
2 "adminUser": {
3 "user-id": "0",
4 "user\_Name": "admin"
5 },
6 "projectId": 999,
7 "projectName": "p-1",
8 "userBeanList": [
9 {
10 "user-id": "3",
11 "user\_Name": "name3"
12 },
13 {
14 "user-id": "2",
15 "user\_Name": "name2"
16 }
17 ],
18 "userIdList": [
19 "3",
20 "2",
21 "1"
22 ]
23 }
注意看,(防盗连接:本文首发自https://blog.csdn.net/jilodream/ )如果model类字段设置了JSONField注解的话,则优先级最高,如果未设置该注解的话,则按照model类中字段的名称进行设置。而基本类型、复杂类型、复杂类型容器等场景均支持。场景二、Model对象转Json字符串新增代码如下:
1 @PostConstruct
2 public void handleJson2() {
3 String newSourceJson="{\"projectId\":999,\"projectName\":\"p-1\"," +
4 "\"userBeanList\":[{\"userId\":\"3\",\"user\_Name\":\"name3\"},{\"user-id\":\"2\"," +
5 "\"user\_Name\":\"name2\"}],\"userIdList\":[\"3\",\"2\",\"1\"]}";
6 ProjectModel newProject = JSONObject.parseObject(newSourceJson,
7 ProjectModel.class);
8 String newProjectJson = JSON.toJSONString(newProject);
9 System.out.println(newSourceJson);
10 System.out.println(newProjectJson);
11 }
Json串我们使用场景1的输出,但是稍作修改:删掉adminUser,同时注意userBeanList容器中的元素,两个id的key不一样,一个叫做userId(类字段名),一个叫做user-id(JSONField的name值)。然后再将对象转为Json串,用这两个Json串进行比较:
经过转换后,userId字段消失了,这是由于null值不会被序列化出来的缘故。也从侧面证明了反序列化时,如果@JSONField存在的话,必须要与@JSONField值保持一致,否则字段值不会写入。如图:
另外我们补充一个特殊情况情况,Model对象的字段为null转Json串时,如何保留null值:(防盗连接:本文首发自https://blog.csdn.net/jilodream/ )注意第8行的转换增加了参数SerializerFeature.WriteMapNullValue
1 @PostConstruct
2 public void handleJson3() {
3 String newSourceJson="{\"projectId\":999,\"projectName\":\"p-1\"," +
4 "\"userBeanList\":[{\"userId\":\"3\",\"user\_Name\":\"name3\"},{\"user-id\":\"2\"," +
5 "\"user\_Name\":\"name2\"}],\"userIdList\":[\"3\",\"2\",\"1\"]}";
6 ProjectModel newProject = JSONObject.parseObject(newSourceJson,
7 ProjectModel.class);
8 String newProjectJson=JSON.toJSONString(newProject, SerializerFeature.WriteMapNullValue);
9 System.out.println(newSourceJson);
10 System.out.println(newProjectJson);
11 }
效果如下,生成的json串会保留null字段