前言
JSON是一种轻量级的数据交换格式。采用完全独立于编程语言的文本格式来存储和表示数据。层次结构简洁明了,易于阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
语法
json的每个数据都是由键值对(key:value)组成的;
每组数据之间使用","来分隔;
如果存在特殊字符需使用"\"进行转义;
使用大括号{ }来保存对象,每个对象由若干数据组成;
{"key1":value1,"key2":value2,"key3":value3,...,"keyn":valuen}
使用中括号[ ]保存数组(集合),数组(集合)中可以包含若干个对象
[{"key1":value1,"key2":value2,"key3":value3,...,"keyn":valuen},{"key1":value1,"key2":value2,"key3":value3,...,"keyn":valuen},{"key1":value1,"key2":value2,"key3":value3,...,"keyn":valuen}]
{
data : [
{"key1":value1,"key2":value2,"key3":value3,...,"keyn":valuen}, {"key1":value1,"key2":value2,"key3":value3,...,"keyn":valuen}, {"key1":value1,"key2":value2,"key3":value3,...,"keyn":valuen}
]
}
JSON---用途
在计算机之间进行数据传递
JSON---特点
JSON只允许使用UTF-8编码,不存在编码问题;
JSON内容仅包含(key:value)键值对,格式简单,不存在冗余结构,是一种轻量级的数据交换格式;
浏览器内置JSON支持,将数据用JSON发送至浏览器,可以之间使用JavaScript处理;因此,在开发互联网应用时,由于JSON简单便捷的特点,绝大多数RESTAPI都使用JSON作为数据传输格式;
Java解析JSON
在Java开发应用程序过程中,往往面临Java对象与JSON数据格式之间的互相转换,因此我们需要掌握如何使用第三方库来进行JSON解析;
常用解析JSON的第三方库:
Jackson、Gson、Fastjson等
使用Fastjson解析JSON
什么是fastjson?
fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。
Fastjson的优点
速度快、使用广泛、测试完备、使用简单、功能完备
Fastjson主要对象
fastjson主要使用JSON、JSONObject、JSONArray三个类。其中JSONObject与JSONArray继承自JSON
JSON类
JSON类的主要作用是用于原始转换
常用方法:
序列化:将Java格式转换为Json格式的数据
反序列化:将Json格式的字符串转换成Java对象
public class Demo {
public static void main(String[] args) {
PoliceStation ps1=new PoliceStation();
ps1.setName("周县派出所");
ps1.setAddr("周县456号");
ps1.setTel("151234555237");
//序列化:将Java格式转换为Json格式的数据
String json1=JSON.toJSONString(ps1);
System.out.println(json1);
//反序列化:将Json格式的字符串转换成Java对象
String jsonStr="{\"addr\":\"周县456号\",\"name\":\"周县派出所\",\"tel\":\"151234555237\"}";
PoliceStation ps2=JSON.parseObject(jsonStr,PoliceStation.class);
System.out.println(ps2);
}
}
JSONObject类
JSONObject类主要用于封装key-value键值对数据,继承自LinkedHashMap接口
常用方法:
将JSON格式数据转化成指定自定义实例对象
JSON.parseObject(String text,Class<T> clazz)
public class Demo{
public static void main(String[] args) {
String jsonStr="{\r\n" +
" \"temperature\": \"24℃~39℃\",\r\n" +
" \"weather\": \"小雨\",\r\n" +
" \"weather_id\": {\r\n" +
" \"fa\": \"07\",\r\n" +
" \"fb\": \"07\"\r\n" +
" },\r\n" +
" \"wind\": \"东北风3-5级\",\r\n" +
" \"week\": \"星期一\",\r\n" +
" \"city\": \"西安\",\r\n" +
" \"date_y\": \"2022年07月11日\",\r\n" +
" \"dressing_index\": \"炎热\",\r\n" +
" \"dressing_advice\": \"天气炎热,建议着短衫、短裙、短裤、薄型T恤衫等清凉夏季服装。\",\r\n" +
" \"uv_index\": \"弱\",\r\n" +
" \"comfort_index\": \"\",\r\n" +
" \"wash_index\": \"不宜\",\r\n" +
" \"travel_index\": \"较不宜\",\r\n" +
" \"exercise_index\": \"较不宜\",\r\n" +
" \"drying_index\": \"\"\r\n" +
"}";
//JSONObject继承自LinkedHashMap
JSONObject weatherJsonobj=JSON.parseObject(jsonStr);
System.out.println(weatherJsonobj);
//根据key获取对应的value
String city=weatherJsonobj.getString("city");
System.out.println("城市:"+city);
String wind=weatherJsonobj.getString("wind");
System.out.println("风力:"+wind);
String temperature=weatherJsonobj.getString("temperature");
System.out.println("温度:"+temperature);
String weather=weatherJsonobj.getString("weather");
System.out.println("天气:"+weather);
}
}
JSONArray类
JSONArray类主要用于封装数组集合类的数据,它继承自ArrayList
常用方法
将JSON格式的数据转换成指定的泛型集合
JSON.parseObject(String Text, Class<T> clazz)
public class Demo{
public static void main(String[] args) {
String s="{\r\n" +
" \"title\": \"上海市政派出所信息\",\r\n" +
" \"list\": [{\r\n" +
" \"name\": \"文保分局沪东高校派出所\",\r\n" +
" \"addr\": \"中山北一路801号\",\r\n" +
" \"tel\": \"22027732\"\r\n" +
" }, {\r\n" +
" \"name\": \"文保分局沪西高校派出所\",\r\n" +
" \"addr\": \"芙蓉江路55号\",\r\n" +
" \"tel\": \"62751704\"\r\n" +
" }, {\r\n" +
" \"name\": \"水上公安局吴淞水上派出所\",\r\n" +
" \"addr\": \"淞浦路187号\",\r\n" +
" \"tel\": \"56671442\"\r\n" +
" }, {\r\n" +
" \"name\": \"水上公安局杨浦水上派出所\",\r\n" +
" \"addr\": \"杨树浦路1291号\",\r\n" +
" \"tel\": \"65898004\"\r\n" +
" }, {\r\n" +
" \"name\": \"水上公安局外滩水上派出所\",\r\n" +
" \"addr\": \"中山东二路8弄3号\",\r\n" +
" \"tel\": \"63305388\"\r\n" +
" }, {\r\n" +
" \"name\": \"水上公安局石洞口水上派出所\",\r\n" +
" \"addr\": \"盛石路18号\",\r\n" +
" \"tel\": \"56152176\"\r\n" +
" }, {\r\n" +
" },";
JSONObject jsonObj=JSON.parseObject(s);
System.out.println(jsonObj.getString("title"));
//遍历方式一
//获取key为list的value值(集合)
//JSONArray extends java.util.ArrayList
JSONArray jsonArray=jsonObj.getJSONArray("list");
System.out.println(jsonArray.size());
//遍历
for(int i=0;i<jsonArray.size();i++) {
JSONObject item=jsonArray.getJSONObject(i);
System.out.println("派出所的名称:"+item.getString("name"));
System.out.println("派出所的地址:"+item.getString("addr"));
System.out.println("派出所的电话:"+item.getString("tel"));
System.out.println("--------------------------------------------");
}
}
}