概述

JSON是一种轻量化的数据传输格式,在各种场景都有运用。比如在ajax中,服务端的数据一般通过JSON字符串的格式传输给前端,前端ajax引擎自动将JSON字符串转化为JS对象(需要将ajax的返回内容格式设置为"json")。那么此时我们在后台服务器中就需要将封装好的JavaBean对象转化为JSON格式字符串来传输给前台ajax引擎,此时使用JSON转化工具将大大简化我们代码量。

首先我们需要明确的是什么是JSON格式

JSON格式有两种,一种是对象格式,另一种是数组格式(也可以叫集合)。

  • 对象格式:{"key1":value1,"key2":value2......}
  • 数组形式:[{对象1},{对象2}....]

   需要注意的是

  1. 这里的value可以是字符串形式,也可以是数值形式,还可以是布尔型(除了字符串形式需要打引号,其他两种都不用打)
  2. JSON严格的规定中,key是必须打双引号的,不能为单引号,所以在java代码手动连接JSON字符串时需要用转义字符。
  3. 虽然在跟多环境中兼容key不打引号的JSON格式,但为了在所有环境下兼容我们还是都加上双引号吧。

JSON转换工具的使用

    一. GSON转换工具的使用

  1. 在使用之前我们需要引入所需的jar包(gson-2.2.4.jar)。
  2. 创建Gson对象。
  3. 调用该对象的toJson()方法。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {CategoryService service=new CategoryService();List<Category> list=service.getCategoryList();//创建Gson对象Gson gson=new Gson();//调用toJson()方法String json = gson.toJson(list);response.setContentType("text/html;charset=UTF-8");response.getWriter().write(json);}

二.JSONLib转换工具的使用

使用前需要导的包:

1.获取JSON字符串中的属性值(字符串->java对象)

public class Hello {@Testpublic void test() {String jsonStr="{\"id\":\"123\",\"name\":\"tom\"}";JSONObject json = JSONObject.fromObject(jsonStr);int id = json.getInt("id");String name=json.getString("name");}
}

2.将Java对象转换成JSON字符串(java对象->字符串)

在演示之前我们给出一个JavaBean对象(省略get和set方法):

public class User {private Long uid;private String email;private Long initSize;//get和set方法省略
}

     2.1 将List集合转换成JSON字符串数组形式(使用JSONArray对象)

public class Hello {@Testpublic void test() {List<User> list=new ArrayList<>();User u1 = new User();u1.setUid(1L);u1.setEmail("1@qq.com");list.add(u1);User u2=new User();u2.setUid(2L);u2.setEmail("2@qq.com");list.add(u2);//将List转换成Json字符串JSONArray json = JSONArray.fromObject(list);String jsonStr=json.toString();System.out.println(jsonStr);}
}

输出结果:

     2.2将JavaBean对象转换成JSON字符串对象形式(使用JSONObject方法)

public class Hello {@Testpublic void test() {User u = new User();u.setUid(1L);u.setEmail("1@qq.com");JSONArray json = JSONArray.fromObject(u);String jsonStr=json.toString();System.out.println(jsonStr);}
}

输出结果:

   2.3.将现有对象转换成JSON字符串时,添加排除属性

在某些情况下,我们转换对象中不是所有属性都需要转换成JSON字符串中,此时我们只需要添加排除即可。例如在2.1和2.2中User对象中的initSize属性,我们不需要转换成字符串,我们只需要这么做。

public class Hello {@Testpublic void test() {User u = new User();u.setUid(1L);u.setEmail("1@qq.com");//添加排除JsonConfig config=new JsonConfig();config.setExcludes(new String[] {"initSize"});JSONObject json = JSONObject.fromObject(u,config);String jsonStr=json.toString();System.out.println(jsonStr);}
}

输出结果:

注:这里添加的排除,不是只对当前层级的Java对象有用,对当前层级中引用的其他对象中的属性同样有用。在有的Java对象中我们可能会封装引用类型的属性,也有可能多个对象的互相引用。在转换时会由于形成了死循环而报错。此时必须添加排除,破坏原先的循环嵌套才能成功转换。

Java对象的嵌套循环导致转换失败的问题,详见博主另一篇文章:

在SSH框架中,多个持久层对象相互引用,从而引发分页查询中,查询所得的持久化对象转换为JSON字符串报错的原因及解决方案

FastJSON使用

在演示FastJSON的操作之前,我们先给出后面需要用到两个实体类(其中getter和setter方法省略):

public class User {private String name;private int age;@Overridepublic String toString() {return "User [name=" + name + ", age=" + age + "]";}
}
public class UserGroup {private String name;private List<User> users = new ArrayList<User>();@Overridepublic String toString() {return "UserGroup [name=" + name + ", users=" + users + "]";}
}

一. 对象序列化

所谓序列化就是将对象转换成字符串

// 序列化@Testpublic void testObjectToJson() throws Exception {User user1 = new User();user1.setName("张三");user1.setAge(12);// {"age":12,"name":"张三"}String json = JSON.toJSONString(user1);System.out.println(json);}@Testpublic void testObjectToArray() throws Exception {User user1 = new User();user1.setName("张三");user1.setAge(12);User user2 = new User();user2.setName("李四");user2.setAge(12);List<User> list = new ArrayList<User>();list.add(user1);list.add(user2);UserGroup group = new UserGroup();group.setUsers(list);group.setName("root");// 将List转成JSON// [{"age":12,"name":"张三"},{"age":12,"name":"李四"}]String json = JSON.toJSONString(list);System.out.println(json);// 将UserGroup转换成Json// {"name":"root","users":[{"age":12,"name":"张三"},{"age":12,"name":"李四"}]}String json2 = JSON.toJSONString(group);System.out.println(json2);}

二. 定制序列化

// 定制序列化
//如果age属性<18,则在序列化时不显示该属性@Testpublic void testPrtopertyJson() throws Exception {PropertyFilter filter = new PropertyFilter() {@Overridepublic boolean apply(Object object, String name, Object value) {// 如果age属性<18,则在序列化时不显示该属性if (name.equals("age")) {if ((Integer) value < 18) {return false;}}return true;}};User user1 = new User();user1.setName("张三");user1.setAge(18);String jsonString = JSON.toJSONString(user1, filter);System.out.println(jsonString);}

三. 反序列化

// 反序列化为对象@Testpublic void testJsonToObj() throws Exception {String json = "{\"age\":12,\"name\":\"张三\"}";// JSON会尽最大可能转换成User对象User user = JSON.parseObject(json, User.class);System.out.println(user);}// 反序列化为集合@Testpublic void testJsonToList() {String json = "[{\"age\":12,\"name\":\"张三\"},{\"age\":12,\"name\":\"李四\"}]";List<User> list = JSON.parseArray(json, User.class);System.out.println(list);}// 反序列化为对象,对象里面包含List集合@Testpublic void testJsonToObj2() throws Exception {String json = "{\"name\":\"root\",\"users\":[{\"age\":12,\"name\":\"张三\"},{\"age\":12,\"name\":\"李四\"}]}";UserGroup group = JSON.parseObject(json, UserGroup.class);System.out.println(group);}

JSON转化工具的使用相关推荐

  1. Json解析工具Jackson(使用注解)

    接上一篇文章Json解析工具Jackson(简单应用),jackson在实际应用中给我们提供了一系列注解,提高了开发的灵活性,下面介绍一下最常用的一些注解 @JsonIgnoreProperties ...

  2. Json解析工具Jackson(简单应用)

    概述 Jackson库(http://jackson.codehaus.org),是基于Java语言的开源json格式解析工具,整个库(使用最新的2.2版本)包含3个jar包: jackson-cor ...

  3. excel转json对象工具推荐

    excel转json对象工具推荐 在工作中,有时候会遇到需要把excel写成表格的情况出现,如果一个个写实在是太浪费时间了,在摸索的过程中发现一个实用的工具:表格数据转换工具 具体的操作步骤 如下图所 ...

  4. 常用的json处理工具类

    json工具的使用说明 在日常的开发中,经常会对json字符串进行处理,最常见的操作为序列化和反序列化,而当后端的开发使用的是spring boot框架时,在前后端进行交互时,是会自动的序列化和反序列 ...

  5. (ObjectMapper)Json转化对象的基本原理

    文章目录 1. 前言 2. 先说结论 3. 证明结论 4. 使用@JsonAutoDetect定义字段.方法的访问可见性规则 1. 前言 在实际开发过程中,会经常接收Json字符串并转化为相应对象,而 ...

  6. 解决Python自带的json序列化工具不能序列化datetime类型数据问题

    解决Python自带的json序列化工具不能序列化datetime类型数据问题 参考文章: (1)解决Python自带的json序列化工具不能序列化datetime类型数据问题 (2)https:// ...

  7. 文本转化工具dos2unix

    文本转化工具dos2unix 由于历史原因,各个平台使用的文本编码规范不同,导致了同一文本在不同平台中显示不同.例如,Windows和Linux的换行符号不同,会造成多行文本显示混乱.为了解决这个问题 ...

  8. 编码/解码和进制转化工具hURL

    编码/解码和进制转化工具hURL 在安全应用中,各种编码方式被广泛应用,如URL编码.HTML编码.BASE64等.而在数据分析时候,各种进制的转化也尤为频繁.为了方便解决这类问题,Kali Linu ...

  9. 【Flutter】JSON 模型转换 ( JSON 序列化工具 | JSON 手动序列化 | 根据 JSON 编写 Dart 模型类 | 在线自动根据 JSON 转换 Dart 类 )

    文章目录 一.JSON 序列化工具 二.JSON 手动序列化 三.根据 JSON 编写 Dart 模型类 四.在线自动转换 五.相关资源 一.JSON 序列化工具 JSON 格式比较简单的话 , 使用 ...

最新文章

  1. vba移动文件_VBA代码解决方案的第68讲内容:利用WSH,复制文件
  2. javascript控制台_如何充分利用JavaScript控制台
  3. 快速排序c语言实现,快速排序的C语言代码实现
  4. 信息学奥赛一本通C++语言——1019: 浮点数向零舍入
  5. Python包管理工具小结
  6. 中props使用this报错_为什么在静态方法中不能使用this
  7. C#中图片单击旋转事件
  8. bzoj 2987: Earthquake(类欧几里得)
  9. 软件开发生命周期中的设计阶段_什么是软件生命周期模型?软件测试和软件开发的关系分析!...
  10. The rxfastforest algorithm case of kaggle
  11. (超详细)夜间灯光总值TNLI如何得到
  12. 防抖和节流的区别是什么?防抖和节流的实现 详解!
  13. FreeBSD搭建Nginx+Apache24+php56+mysql56手把手一步步的笔记
  14. 用python导入dmp到oracle
  15. 分享一下前端浏览的一些网址记录
  16. android 下拉列表动画,android下拉列表空间Spinner的三种使用方法
  17. uniapp报错 -4048
  18. QQ号与QQ群的网页上的聊天方法
  19. 深度学习3—用三层全连接神经网络训练MNIST手写数字字符集
  20. UART介绍版(勿看简单介绍)

热门文章

  1. C语言实现银行家算法
  2. sqlserver 表值函数
  3. 快速理解Linux中su和su -的区别
  4. Independently Recurrent Neural Network
  5. 计算机编写的程序具有可移植性,用高级程序设计语言编写的程序()。A.计算机能直接执行B.可读性和可移植性好C.可读性差但执行效率...
  6. Python面向对象总结3
  7. python 制作火车时刻表
  8. js Blob、ArrayBuffer(Uint8Array、TypedArray、DataView)、Buffer、DataUrl
  9. HiveSql面试题12--如何分析去掉最大最小值的平均薪水(字节跳动)
  10. 网络安全意识 | 震惊!密码保护竟然是个圈