一.JSON简介
AVAScript Object Notation是一种轻量级的数据交换格式
具有良好的可读和便于快速编写的特性。
业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的支持)
JSON采用兼容性很高的文本格式,同时也具备类似于C语言体系的行为。 – Json.org
JSON作为数据是目前网络中主流的数据传输格式之一,应用十分广泛,说是使用率达到99%一点也不勉强
二.JSON语法
JSON 语法
作用: JSON文本是类似XML文本文件,用来储存和传输数据信息的的媒介
注: JSON同XML一样,不仅可以通过响应文件作为数据的载体,也可以通过满足语法字符串作为对应数据的载体 称之为 “json字符串”
json数据存储采用{}与[]语法
{} => java中的双列集合 (字典)
[] => java中的单列集合 (数组)
- json语法最顶层为 单一{} 或 单一[]
- json语法中结构为 {} [] 相互嵌套({}可以嵌套{}[],[]也可以相互嵌套{}[])
- json语法中以逗号(,)作为字段分割的标识(注: 最后一个字段不能添加逗号)
-
字典中语法为 {“key”:value}格式 (注: key为字符串)
多条语句语法:
{
“key1”: value1,
“key2”: value2,
… : … ,
“keyn”: valuen
}
- 数组中语法为[value1,value2,value3] 格式(注: value拥有类型)
- 数字(整数或浮点数)
- 逻辑值(true 或 false)
- 字符串(在双引号中)
- 数组(在方括号中)
- 函数
- 对象(在大括号中)
- null
- {}和[]中的每一个value均可以为{}|[] ,且多个value类型不一定相同
7.我们在JSON解析中只有三中情况出现
1.{} 解析’大括号’类型
2. [ ] 解析是’中括号’类型
3. 其实只有两种,那第三种则是1与2的组合方法即”{”name”:”小东吖”,”hobby”:[“编程”,”电竞”,”睡觉”]}”那么下面分别来看一些这三种类型以及解析
三.解析JSON
SON解析一定要掌握的两条规则:
1.如果看到是{ }–>使用JSONObject
2.如果看到的[ ]–>使用JSONArray解析
掌握了JSON的数据类型和基本语法后,我们对JSON的各种语法类型进行详细解析(注意掌握两条规则的使用,掌握了JSON解析就那么回事)
我们在eclipse里面操作JSON解析的时候需要第三方jar包的支持 (可以从网上下载)
// JSON字符串以{}包裹,解析为JSONObject对象
// JSON字符串以[]包裹,解析为JSONArray对象
// 纯数组解析
public static void main(String[] args) {
String string = "[\"天津\",\"上海\",\"北京\",\"南京\"]";
// []是数组 将其解析为JSONArray数组即可 拥有数组的方法
JSONArray jsonArray = JSON.parseArray(string);
System.out.println(jsonArray);
// 纯对象解析
String oString = "{\"name\" : \"小东吖\" }";
// 大括号是对象类型的 解析为JSONObject类型即可
JSONObject jsonObject = JSON.parseObject(oString);
// parseObject的参数(字符串,类名.class); 就可解析为对象
Student student = jsonObject.parseObject(oString, Student.class);
System.out.println(student);
Student类 通过setter getter 方法去匹配属性
public class Student {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
// toString方法用于控制台输出
@Override
public String toString() {
return "Student [name=" + name + "]";
}
三.综合性解析
- 先写一个JSON文件
{
"states":,
"msg":"蓝鸥剑桥学院",
"data":
[
{
"tag": "Teachers",
"data":
[
{
"name": "王大锤",
"gender": "男",
"subject": "尬艺术",
"salary":
},
{
"name": "苍肖峰",
"gender": "女",
"subject": "体艺术",
"salary":
},
{
"name": "马小璐",
"gender": "未知",
"subject": "媚艺术",
"salary":
}
]
},
{
"tag": "Students",
"data":
[
{
"name": "胡一彪",
"gender": "男",
"age": ,
"class": "三班"
},
{
"name": "刘宝宝",
"gender": "男",
"age": ,
"class": "八班"
},
{
"name": "王思思",
"gender": "女",
"age": ,
"class": "四班"
},
{
"name": "雷布斯",
"gender": "女",
"age": ,
"class": "五班"
}
]
}
]
}
- 解析 明确一点解析的结果为对象 需要创建一个School类
-
一:第一层 (JSONObject){”status”: “msg”: “data”}
二:第二层 (JSONArray) []
三:第三层 (JSONObject) {} 里面包含”Teachers” “Students” 里面嵌套的都是(JSONObject){}
这就需要咱们在解析的时候需要很细致的去创建对应的属性值,JSON解析并不难,而难受的地方就提现在对类的创建中,只要够细心也超简单!
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lesson.ls01.JSONs;
// 功能: 对外提供一个公用的JSON解析结果
// 定义单例的原因: 公用--封装 | 单一 -- 单例
public class AnalyisisJSON {
// 对外提供单一对象
private static Map<String,List<Object>> school = null;
// 对外提供的对象和自身没关系
// 不对外提供构造器 且自身构造器不需要做任何操作
private AnalyisisJSON() {}
public static Map<String,List<Object>> jsonToMap() {
// 单例对外提供的单例方法 作为一对象赋值
// 唯一对象为school对应的map 赋值的操作为JSON数据的解析
System.out.println("开始获取数据!!!");
if (school == null) {
school = analyse();
}
return school;
}
// 解析方法
public static Map<String,List<Object>> analyse() {
// 单例 延迟测试单例
long timeMillis = System.currentTimeMillis();
while (System.currentTimeMillis()-timeMillis <) {}
Map<String,List<Object>> map = new HashMap<>();
String jStr = JSONs.jsonString("src/lesson/ls02/School.json");
// 第一层
JSONObject jsonObject = JSON.parseObject(jStr);
// 第二层
JSONArray jsonArray = jsonObject.getJSONArray("data");
// 第三层 分Teachers | Students
for (int i = ; i < jsonArray.size(); i++) {
JSONObject jObject = jsonArray.getJSONObject(i);
// 第四层 Teacher-数组 | Students-数组
JSONArray jArray = jObject.getJSONArray("data");
String tag = jObject.getString("tag");
// 第五层 整体解析为 List
if (tag.equals("Teachers")) {
List<Teacher> ts = JSON.parseArray(jArray.toJSONString(), Teacher.class);
// 向上转型 把teacher类转为object
List<Object> os = new ArrayList<>(ts);
map.put(tag, os);
}
if (jObject.getString("tag").equals("Students")) {
List<Student> ss = JSON.parseArray(jArray.toJSONString(), Student.class);
List<Object> os = new ArrayList<>(ss);
map.put(tag, os);
}
}
return map;
}
}
// 这里我将JSON文件转为字符串的方法封装起来
public class JSONs {
// 解析JSON文件转换成JSON字符串
// 分析: BufferedReader-行读取文本内容
// StringBuffer将读取的内容一次次拼接
// 将最终的字符串为结果返回
// 功能: 将JSON文件转化为JSON字符串,采用 注解 方式解决
public static String jsonString(String filePath){
StringBuffer sb = new StringBuffer();
File file = new File(filePath);
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader(file));
String line = "";
while ((line = reader.readLine()) != null) { // 读完是空的
sb.append(line.trim());
}
} catch (Exception e) {
System.out.println("json字符串解析失败 -- " + e.getMessage());
} finally {
try {
if (reader != null)
reader.close();
} catch (IOException e) {
System.out.println("流关闭失败 -- "+ e.getMessage());
}
}
// 构造器将StringBuffer转为字符串 返回
return new String(sb);
}
}
public class Test {
public static void main(String[] args) {
Map<String,List<Object>> school = AnalyisisJSON.jsonToMap();
System.out.println("school: " + school);
}
}
Student类
import com.alibaba.fastjson.annotation.JSONField;
public class Student {
private String name;
private String gender;
private int age;
// 注解
@JSONField(name = "class")
private String clazz;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getClazz() {
return clazz;
}
public void setClazz(String clazz) {
this.clazz = clazz;
}
@Override
public String toString() {
return "Student [name=" + name + ", gender=" + gender + ", age=" + age + ", clazz=" + clazz + "]";
}
}
Teacher类
public class Teacher {
private String name;
private String gender;
private String subject;
private String salary;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getSalary() {
return salary;
}
public void setSalary(String salary) {
this.salary = salary;
}
@Override
public String toString() {
return "Teacher [name=" + name + ", gender=" + gender + ", subject=" + subject + ", salary=" + salary + "]";
}
其实:
1.首先是对JSON数据的一个分析 先把JSON文件读取转为字符串
2.其次是掌握JSON一些技巧(看到{}对象形JSONObject ,[]数组形JSONArray)
3.而后是对对应的属性值进行对应的字段封装建立对应的类(分析要细心,思路要清晰,程序这行需要有耐心不能浮躁)
4.而后是解析中要有明确的思路