Json格式在后台服务中的重要性就不多说了,直入正题。
首先引入pom文件,这里使用的是1.2.83版本

1         <dependency>
2 <groupId>com.alibaba</groupId>
3 <artifactId>fastjson</artifactId>
4 <version>1.2.83</version>
5 </dependency>

接着我们尝试验证两种场景

1、Model对象转Json字符串

2、Json字符串转Model对象

在验证之前我们需要先编写一个model类,这个model类的字段我们可以使用fastJson中的注解@JSONField来修饰,并添加name值
这个注解的字段是,将该model类的字段和对应的json对象的key相对应起来。(防盗连接:本文首发自http://www.cnblogs.com/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<String> userIdList;
8 @JSONField(name = "userBeanList")
9 private List<User> 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<String> 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<ProjectModel.User> 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 }

注意看,(防盗连接:本文首发自http://www.cnblogs.com/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值:(防盗连接:本文首发自http://www.cnblogs.com/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字段

Springboot 通过FastJson实现bean对象和Json字符串互转的更多相关文章

  1. Json对象与Json字符串互转(转载)

    一.jQuery插件支持的转换方式 1 $.paseJSON(jsonstr);//将json字符串转换为json对象 二.浏览器支持的转换方式(Firefox,Chrome,Opera,Safair ...

  2. Json对象与Json字符串互转(4种转换方式)

    Json字符与Json对象的相互转换方式有很多,接下来将为大家一一介绍下,感兴趣的朋友可以参考下哈,希望可以帮助到你 1>jQuery插件支持的转换方式: 复制代码代码如下: $.parseJS ...

  3. Json对象与Json字符串互转

    1>jQuery插件支持的转换方式: 复制代码 代码如下: $.parseJSON( jsonstr ); //jQuery.parseJSON(jsonstr),可以将json字符串转换成js ...

  4. Json对象与Json字符串互转(4种转换方式)(转)

    1>jQuery插件支持的转换方式: $.parseJSON( jsonstr ); //jQuery.parseJSON(jsonstr),可以将json字符串转换成json对象  2> ...

  5. json对象与json字符串互转方法

    jQuery插件支持的转换方式: 复制代码 代码如下: $.parseJSON( jsonstr ); //jQuery.parseJSON(jsonstr),可以将json字符串转换成json对象 ...

  6. 前端Json对象与Json字符串互转(4种转换方式)

    1>jQuery插件支持的转换方式: $.parseJSON( jsonstr ); //jQuery.parseJSON(jsonstr),可以将json字符串转换成json对象 2>浏 ...

  7. Json对象与Json字符串互转(4种转换方式) jquery 以及 js 的方式

    http://blog.csdn.net/zero_295813128/article/details/51545467

  8. fastjson: json对象,json对象数组,javabean对象,json字符串之间的相互转化

    fastjson: json对象,json对象数组,javabean对象,json字符串之间的相互转化 在开发过程中,经常需要和前端交互数据,数据交互的格式都是JSON,在此过程中免不了json字符串 ...

  9. java对象与Json字符串之间的转化(fastjson)

    1. 首先引入jar包 在pom.xml文件里加入下面依赖: <dependency> <groupId>com.alibaba</groupId> <art ...

随机推荐

  1. 基于PYQT5的截图翻译工具

    基于PYQT5的截图翻译工具 功能介绍 翻译功能 截图功能(快捷键 + 截图存储到剪切板中) 文字识别OCR(基于百度API的文字识别) UI 界面 截图 截图可以使用第三方截图 或 使用PyQt5截 ...

  2. React设置proxy后依旧报CROS错误

    1.判断表单数据是否为后端接收的类型 POST GET2.axios自动转换问题 手动添加标头这份表单数据包括了files (二进制数据)而标头显示是JSON格式 不符 所以报CROS 更多文章请移步 ...

  3. CabloyJS一站式助力微信、企业微信、钉钉开发 - 钉钉篇

    前言 现在软件开发不仅要面对前端碎片化,还要面对后端碎片化.针对前端碎片化,CabloyJS提供了pc=mobile+pad的跨端自适应方案,参见:自适应布局:pc = mobile + pad 在这 ...

  4. ruoyi接口权限校验

    此文章属于ruoyi项目实战系列 ruoyi系统在前端主要通过权限字符包含与否来动态显示目录和按钮.为了防止通过http请求绕过权限限制,后端接口也需要进行相关权限设计. @PreAuthorize使 ...

  5. WPF开发随笔收录-本地日志LogUtil类

    一.前言 生活中的日志是记录你生活的点点滴滴,让它把你内心的世界表露出来,更好的诠释自己的内心世界.而在开发者眼中的日志是我们排除问题的第一手资料,项目中的程序上线之后,一旦发生异常,第一件事就是先去 ...

  6. Linux文件的删除和软硬链接

    文件的构成 由元数据(metadata)和数据(data)两部分组成 硬盘分区上一块空间存该分区上文件的元数据,一块空间存这些文件的数据 因为元数据和数据分离存放,所以需要通过指针地址来进行关联 元数 ...

  7. js与java encodeURI 进行编码与解码

    JS escape()使用转义序列替换某些字符来对字符串进行编码  JavaScript 中国 编码后 JavaScript %u4E2D%u56FD unescape()对使用   encodeUR ...

  8. windows平台编译CEF支持H264(MP3、MP4)超详细

    编译目标(如何确定目标定版本请查看:BranchesAndBuilding) CEF Branch:4664 CEF Commit:fe551e4 Chromium Version:96.0.4664 ...

  9. GRAPH CONVOLUTIONAL NETWORK WITH SEQUENTIAL ATTENTION FOR GOAL-ORIENTED DIALOGUE SYSTEMS

    面向领域特定目标的对话系统通常需要建模三种类型的输入,即(i)与领域相关的知识库,(ii)对话的历史(即话语序列)和(iii)需要生成响应的当前话语. 在对这些输入进行建模时,当前最先进的模型(如Me ...

  10. Spring Boot 知识点总结

    现在仅总结重要和实用的知识点,更加全面的请见链接:1.:2.. 微服务:架构风格(服务微化):一个应用应该是一组小型服务:可以通过HTTP的方式进行互通:微服务:每一个功能元素终都是一个可独立替换和独 ...