JSON
JavaScript Object Notation(JavaScript 对象表示法)是目前最常用的执行对象序列化的方式。
虽然 json 最初是为了在 JavaScript 语言中使用的,但实际上 json 本身跟语言没有任何关系,各种编程语言都可以使用。
json官方指定了一套标准,各种语言都支持这一套标准,所以 json 也能作为一种跨语言的文本数据(即不支持其它多媒体)交换格式,无障碍的把数据传递到其它语言的程序。
JSON 基本格式:
必须是:对象
{
}
或 数组
[
]
JSON 语法规则:
JSON 值的类型:
值可以是数组、对象,就意味着数据和对象可以任意嵌套、任意深度。
范例:
{
"name": "韦小宝",
"age": 26,
"height": 182.4,
"birthday": "1670-7-28",
"isRich": true,
"wifes": ["阿珂", "双儿", "建宁公主", "苏荃", "沐剑屏", "曾柔", "方怡"],
"firstMaster": {
"name": "陈近南",
"birthday": "1634-12-1"
}
}
在 Java 程序中如何操作和使用 json 呢?最常见的是使用 FastJSON
FastJSON
FastJSON
是一个Java语言编写的高性能、功能完善、完全支持官方标准的 JSON
库。
使用 FastJson
来操作 json 以及完成对象序列化、反序列化的操作,会非常方便。
对象序列化
下面我们来看一下使用 FastJSON
进行对象序列化的例子。
<!-- 在下列地址查询最新的版本:https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>
注释中的URL,可以查询最新的版本号。一般来说版本号越高,说明越新。但应避免使用带有 alpha
beta
标记的版本,表示测试版可能不稳定。
使用 FastJSON 序列化对象
首先必须 import
import com.alibaba.fastjson.JSON;
public static void main(String<[] args) {
Building b = new Building();
b.setName("创业大厦");
b.setAddress("天宁兰陵兰陵路26号 ");
String content = JSON.toJSONString(b);
System.out.println(content);
}
调用 JSON.toJSONString(dog)
方法,把 Building
对象转换为 JSON 格式的字符串返回。
使用 FastJSON 反序列化对象
所谓序列化,就是将对象转换为 JSON
格式字符串的过程,那么顾名思义,反序列化就是将 JSON
格式字符串还原为对象的过程。
序列化使用的是 fastjson
库,那么反序列化同样也使用 fastjson
库。
反序列化代码:
public static void main(String[] args) {
Building b = new Building();
b.setName("创业大厦");
b.setAddress("天宁兰陵兰陵路26号");
String content = JSON.toJSONString(b);
// 转换为一个具体的对象
Building b2 = JSON.parseObject(content, Building.class);
String name = b2.getName();
System.out.println(name);
// 特殊情况下,java系统里没有具体对象的 class ,可以反序列化为 Map
Map bInfo = JSON.parseObject(content, Map.class);
String name2 = (String) bInfo.get("name");
System.out.println(name2);
}
反序列化为具体的对象
反序列化时,调用 JSON.parseObject(content, Building.class)
把字符串转换为 Java 对象。
转换为具体的对象后,就可以使用对象的属性和方法了,例如调用 b2.getName();
取值。
反序列化为 Map
少数复杂的场景,程序需要把字符串转换为对象,但是系统中又没有依赖具体的目标类。这时可以把字符串转换为 Map
对象。
-
大家都知道,
Map
是接口,而接口是不能直接实例化的,必须有个类实现接口才能实例化。那么为什么这里可以写Map
接口呢,反序列化后的结果到底是什么呢? -
少数复杂场景,转换为
Map
从而避免依赖具体的类,也是一种 解耦 的表现。让系统更少的依赖其它系统的代码,可以使系统更易于维护。
反序列化为 List
当 JSON 格式是 {}
时,表示对象,可以反序列化为具体的对象或者 Map
当 JSON 格式是 []
表示数组,Java 中一般不直接使用数组,而是更方便的 List
List dataList = JSON.parseObject(content, List.class);
案例一:
["a1","a2","a3"]
表示集合中包含的是字符串(字符串也是对象)。反序列化的结果是:
List<String> dataList = JSON.parseObject(content, List.class);
案例二:
[{"a1":"1"},{"a2":"2"}]
List<Map<String, String>> dataList = JSON.parseObject(content, List.class);
案例三:
[["a1","a2","a3"]]
List<List<String>> dataList = JSON.parseObject(content, List.class);
总之,源数据格式越复杂,反序列化的结果,嵌套就越多也越复杂。在使用过程中一定要注意弄清楚源数据的格式。
原文地址:https://blog.csdn.net/BlueSea_W/article/details/134709684
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_12489.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!