Java解析JSON数据
1、什么是JSON?
JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。
它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。
简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。
易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
2、JSON的语法格式
JSON 语法衍生于 JavaScript 对象标记法语法:
- 数据在键值对中。比如:{“name”:“Bill Gates”} 在 JSON 中,值必须是以下数据类型之一:
- 字符串(在 JSON 中,字符串值必须由双引号编写)
- 数字
- 对象
- 数组
- 布尔
- null
- 数据由逗号分隔
- 花括号容纳对象
- 方括号容纳数组
- 注释符号为 #
一个天气查询API网站返回的JSON实例,网址:
http://www.tianqiapi.com/index/doc?version=v61
{
"cityid":"101271201", #城市编号
"date":"2020-07-15",
"week":"星期三",
"update_time":"10:15", #更新时间
"city":"内江", #城市名称
"cityEn":"neijiang",
"country":"中国",
"countryEn":"China",
"wea":"阴", #实时天气情况
"wea_img":"yin",
"tem":"25", #实时温度
"tem1":"29", #高温
"tem2":"23", #低温
"win":"西风", #风向
"win_speed":"2级", #风力等级
"win_meter":"小于12km/h", #风速
"humidity":"97%", #湿度
"visibility":"24.22km", #能见度
"pressure":"961", #气压
"air":"15", #空气质量
"air_pm25":"8", #pm2.5
"air_level":"优",
"air_tips":"空气很好,可以外出活动,呼吸新鲜空气,拥抱大自然!",
"alarm":{
"alarm_type":"暴雨", #预警类型
"alarm_level":"橙色", #预警等级
"alarm_content":"内江市气象台7月15日5时23分发布第16号暴雨橙色预警信号:
预计我市市中区部分地方3小时降雨量将达50毫米以上,并伴有雷电和阵性大风,请加强防范强降水、雷电和大风等带来的危害。
(预警信息来源:国家预警信息发布中心)" #预警描述
},
"aqi":{ #空气质量指数详情
"air":"15",
"air_level":"优",
"air_tips":"空气很好,可以外出活动,呼吸新鲜空气,拥抱大自然!",
"pm25":"8",
"pm25_desc":"优",
"pm10":"10",
"pm10_desc":"优",
"o3":"47",
"o3_desc":"优",
"no2":"12",
"no2_desc":"优",
"so2":"8",
"so2_desc":"优",
"co": "1",
"co_desc": "优",
"kouzhao":"无需戴口罩",
"waichu":"适宜外出",
"yundong":"适宜运动",
"kaichuang":"适宜开窗",
"jinghuaqi":"关闭净化器",
"cityid":"101271201",
"city":"内江",
"cityEn":"neijiang",
"country":"中国",
"countryEn":"China"
}
}
3、JSON的用途
对于客户端而言,可以通过JSON,将大量数据一次性传送到服务器,对于服务器 而言,可以在单个请求中处理大量的数据。
目前Java较为流行的JSON解析库有谷歌的GSON,阿里的FastJson等。
Gson Jar包下载地址:https://search.maven.org/artifact/com.google.code.gson/gson/2.8.7/jar
FastJson Jar包下载地址:
https://github.com/alibaba/fastjson
4、Java中解析JSON数据
import com.google.gson.Gson;
import java.util.*;
public class GsonAndFastJsonUse {
public static void main(String[] args) {
Person p = new Person();
p.setName("张三"); //String类型
p.setAge(18); //int类型
List<String> hobby = new ArrayList<>();
hobby.add("健身");
hobby.add("游泳");
hobby.add("编程");
hobby.add("唱歌");
hobby.add("弹吉他");
p.setHobby(hobby); //List类型
Map<String,String> idCardInfo = new LinkedHashMap<>();
idCardInfo.put("id","10000");
idCardInfo.put("name","张三");
idCardInfo.put("age","18");
idCardInfo.put("address","China");
p.setIdCardInfo(idCardInfo); //Map类型
Book book = new Book("月亮与六便士","描述了一个原本平凡的伦敦证券经纪人思特里克兰德,突然着了艺术的魔,抛妻弃子,绝弃了旁人看来优裕美满的生活,奔赴南太平洋的塔希提岛,用圆笔谱写出自己光辉灿烂的生命,把生命的价值全部注入绚烂的画布的故事。");
p.setBook(book); //book对象类型
//1.1、将对象转换成JSON字符串
String GsonStr = new Gson().toJson(p);
System.out.println(GsonStr);
//1.2、把字符串转成对象
Person person = new Gson().fromJson(GsonStr, Person.class);
System.out.println(person.getAge());
System.out.println(person.getBook());
System.out.println(person.getName());
System.out.println(person.getHobby());
System.out.println(person.getIdCardInfo());
//1.3 将字符串形式的JSON数组,转成List对象
ArrayList<String> listStr = new Gson().fromJson("[\"一二三四五\",\"上山打老虎\",\"床前明月光\",\"疑是地上霜\"]", ArrayList.class);
for (String str : listStr) {
System.out.println(str);
}
//2.1 把对象转成JSON字符串
String fastJsonStr = JSON.toJSONString(p);
System.out.println(fastJsonStr);
//2.2 把JSON字符串转成对象
Person person1 = JSON.parseObject(fastJsonStr,Person.class);
System.out.println(person.getAge());
System.out.println(person.getBook());
System.out.println(person.getName());
System.out.println(person.getHobby());
System.out.println(person.getIdCardInfo());
//2.3 把字符串形式的JSON数组转成List对象
List<String> strs = JSON.parseArray("[\"一二三四五\",\"上山打老虎\",\"床前明月光\",\"疑是地上霜\"]", String.class);
for (String str : strs) {
System.out.println(str);
}
}
}
class Person {
private String name;
private int age;
private List<String> hobby;
private Map<String,String> idCardInfo;
private Book book;
······
}
class Book {
private String name;
private String info;
······
}