同福

Java操作JSON格式数据的技巧【20210412】

介绍

介绍

JSON格式数据是现如今使用极其广泛的WEB应用的数据格式,它有着结构清晰、语法简单、占用字节少等等特点。相比较早期流行的XML格式数据来讲,JSON格式数据有着更加轻便、可读性更好、解析速度更快等等优势。

Java语言操作JSON格式数据是比较复杂的的,因为Java是强类型语言,针对于JSON这种格式的数据解析起来太吃力了。在PHP或者Python这样的弱类型语言里面无论JSON格式数据是怎么样的都可以直接解析出来,但是在Java里面复杂的多级符合结构就需要自己设计对应的实体对象才能正常解析成功。

JSON

JSON格式数据除了基本数据类型整型、浮点、字符串、布尔之外,还有两个特殊的集合型类型,它们就是数组(Array)和字典(Dictionary),下面福哥将分别给大家介绍一下。

字典

所谓的字典类型就是结构内的数据是以Key-Value的方式成对的存储的,通过Key可以快速地得到对应的Value,一个字典结构内Key不能重复。

{
  "id": 35,
  "name": "鬼谷子叔叔",
  "url": "https://tongfu.net/home/35.html"
}

数组

数组就是用来存储多个数据的集合,数组内的元素之间没有任何关系,数组内的元素以顺序的整型数字作为键,通过键可以快速地得到对应的元素。

[
  "PHP",
  "Python",
  "Java",
  "JavaScript",
  "C/C++",
  "Asp.net"
]

安装

在Java语言里操作JSON格式数据的库有一大把,福哥比较青睐net.sf.json-lib这个库。

依赖

<!-- json object -->
<dependency>
    <groupId>net.sf.json-lib</groupId>
    <artifactId>json-lib</artifactId>
    <version>2.4</version>
    <classifier>jdk15</classifier>
</dependency>

数组与JSON

在Java语言里面数组转换JSON格式数据是通过JSONArray对象的fromObject方法完成的,和弱类型的语言不同之处在于Java无法使用一个对象同时完成数组和对象转换成为JSON格式数据的需求。

不过只要是相同类型的数组数据都可以使用JSONArray对象来进行转换,包括但不限于字符串、整型、双精和实体对象。

实体

这是一个用户的实体对象

@Data
public class User{
    Integer id;
    String name;
    String link;
}

转换

这是使用JSONArray对象实现的各种类型的数组数据转换成JSON格式数据的示例。

String[] strArr;
int[] intArr;
double[] doubleArr;
User[] userArr;
JSONArray jsonArray;

strArr = new String[]{"同福", "福哥", "鬼谷子叔叔"};
intArr = new int[]{1, 2, 3};
doubleArr = new double[]{1.1, 1.2, 1.3};
userArr = new User[3];
userArr[0] = new User();
userArr[0].setId(15);
userArr[0].setName("同福");
userArr[0].setLink("https://tongfu.net/home/15.html");
userArr[1] = new User();
userArr[1].setId(25);
userArr[1].setName("福哥");
userArr[1].setLink("https://tongfu.net/home/25.html");
userArr[2] = new User();
userArr[2].setId(35);
userArr[2].setName("鬼谷子叔叔");
userArr[2].setLink("https://tongfu.net/home/35.html");
jsonArray = JSONArray.fromObject(strArr);
out += "<h3>字符串数组</h3>";
out += jsonArray.toString();
jsonArray = JSONArray.fromObject(intArr);
out += "<h3>整型数组</h3>";
out += jsonArray.toString();
jsonArray = JSONArray.fromObject(doubleArr);
out += "<h3>双精数组</h3>";
out += jsonArray.toString();
jsonArray = JSONArray.fromObject(userArr);
out += "<h3>实体数组</h3>";
out += jsonArray.toString();

home/topic/2021/0412/21/0a481107bf7f684a8caa7319ffbe456d.jpg

字典与JSON

在Java语言里面字典转换JSON格式数据是通过JSONObject对象的fromObject方法完成的,这里面说的对象可以是Map对象,也可以是实体对象。

Map map = new LinkedHashMap();
User user = new User();
JSONObject jsonObject;

map.put("id", 35);
map.put("name", "鬼谷子叔叔");
map.put("link", "https://tongfu.net/home/35.html");
user.setId(35);
user.setName("鬼谷子叔叔");
user.setLink("https://tongfu.net/home/35.html");
jsonObject = JSONObject.fromObject(map);
out += "<h3>Map对象</h3>";
out += jsonObject.toString();
jsonObject = JSONObject.fromObject(user);
out += "<h3>实体对象</h3>";
out += jsonObject.toString();

home/topic/2021/0412/21/aa4cf2d6b88b8ee9186fe7fe39e74594.jpg

编码与解码

编码

所谓JSON编码就是将其他类型的数据转换成JSON格式数据的过程,因为JSON格式其实就是一个含有特殊格式的字符串,所以JSON编码就是将各种其他类型的数据转成可逆的字符串的过程。

Java实现编码的方式就是通过JSONArray的fromObject和JSONObject的fromObject方法方法完成的,由于福哥还没有用Java开发过GBK编码的项目,所以不知道这两个对象针对GBK编码有没有问题(不过,就福哥的经验判断应该没有问题的)。

因为编码Map对象和编码实体对象没有什么区别,都不需要特别的步骤,所以福哥只放出了一个示例给大家了。

User user = new User();
JSONObject jsonObject;

user.setId(35);
user.setName("鬼谷子叔叔");
user.setLink("https://tongfu.net/home/35.html");
jsonObject = JSONObject.fromObject(user);
out += "<h3>JSON格式</h3>";
out += jsonObject.toString();

home/topic/2021/0412/21/fbcc7466a0ff35491e45329abff633e1.jpg

解码

所谓JSON解码就是将JSON格式数据还原成原来的数据类型的过程,因为JSON格式数据其实就是一个含有特殊格式的字符串,所以JSON解码就是将JSON格式的字符串还原成原来的数据的过程。

Java实现解码的方式就是通过JSONArray的toBean和JSONObject的toBean方法完成的,在进行解码之前我们必须明确解码后的数据对象是什么,并且需要显性地传入到toBean方法里面。

JSON字符串转Map对象

Map map;
JSONObject jsonObject;

jsonObject = JSONObject.fromObject("{\"id\":35,\"link\":\"https://tongfu.net/home/35.html\",\"name\":\"鬼谷子叔叔\"}");
map = (Map) JSONObject.toBean(jsonObject, Map.class);
out += "<h3>源数据</h3>";
out += String.format("(%s)%s - %s", map.get("id").toString(), map.get("name").toString(), map.get("link"));

home/topic/2021/0412/22/91b533818f81bcbc0e452bdfa03a3664.jpg

JSON字符串转实体对象

User user;
JSONObject jsonObject;

jsonObject = JSONObject.fromObject("{\"id\":35,\"link\":\"https://tongfu.net/home/35.html\",\"name\":\"鬼谷子叔叔\"}");
user = (User) JSONObject.toBean(jsonObject, User.class);
out += "<h3>源数据</h3>";
out += String.format("(%d)%s - %s", user.getId(), user.getName(), user.getLink());

home/topic/2021/0412/22/91b533818f81bcbc0e452bdfa03a3664.jpg

总结

今天福哥带着童鞋们针对Java操作JSON格式数据的技巧系统地讲解了一番,相信大家都应该听明白了!Java操作JSON格式数据虽然代码量要远远多于PHP和Python,但是强类型语言的严谨让我们可以对程序运行时的把控更加精准,系统的健壮性也就更加可靠一些,所以通常情况下做后台功能福哥更愿意使用Java开发。

下一课福哥会给大家讲解JavaScript操作JSON格式数据的技巧,敬请期待~~