JSON简介JAVAScript Object Notation是一种轻量级的数据交换格式具有良好的可读和便于快速编写的特性。业内主流技术为其提供了完整的解决方案有点类似于正则表达式 获得了当今大部分语言的支持JSON采用兼容性很高的文本格式同时也具备类似于C语言体系的行为。 – Json.orgJSON作为数据是目前网络中主流的数据传输格式之一应用十分广泛JSON支持的数据类型我们要学习使用JSON解析必须对JSON解析的规则原理有深刻的认识和了解然后才知道它的一个实现原理JSON里面的数据是以一种键值对的方式存在”key”:”value”中值的类型可以是下面数据类型中的任意一种1. 数字整数或浮点数2. 逻辑值true 或 false3. 字符串在双引号中4. 数组在方括号中5. 函数6. 对象在大括号中7. nullJSON语法规则JSON的语法规则非常的简单就是使用大括号’{}’中括号’[]’逗号’’冒号’’双引号’“”’。数据类型嵌套对象、数组、字符串、数字、布尔值或空值。我们在JSON解析中只有三中情况出现1. 解析’大括号’类型2. [ ] 解析是’中括号’类型3. 其实只有两种那第三种则是1与2的组合方法即”’name’:’李书豪’ ’hobby’:[‘编程’,’电竞’,’睡觉’]”那么下面分别来看一些这三种类型以及解析JSON基本语法与图例Object(对象类型)用{ }包含一系列无序的key–Value键值对表示其中Key和Value之间用冒号分割每个key-value之间用逗号分割。比如Array(数组类型)使用[ ]包含所有元素每个元素用逗号分隔元素可以是任意的值比如组合形JSON数据解析JSON解析一定要掌握的两条规则1.如果看到是{ }–使用JSONObject2.如果看到的[ ]–使用JSONArray解析掌握了JSON的数据类型和基本语法后下面我们将对JSON的各种语法类型进行详细解析(注意掌握两条规则的使用,掌握了JSON解析就那么回事)纯对象(Object)的解析{ }:import org.json.JSONException;import org.json.JSONObject;/*** JSON--纯对象(Object)的解析** 注我们在eclipse里面操作JSON解析的时候需要第三方jar包的支持* author sKy°* date 2016-5-8* version 1.0*/public class Json01 {public static void main(String[] args) {// 编辑一个我们要解析的数据对象// 根据JSON的官方定义键加,值如果是字符串就加其他不加。String json{name:李书豪,age:24};try {// 创建JSON解析对象(两条规则的体现:大括号用JSONObject,注意传入数据对象)JSONObject obj new JSONObject(json);// obj.后面有各种数据类型,根据对象来选择使用的数据类型String name obj.getString(name);// 同理如上这里的age为Int类型我们就用对应的类型进行解析int age obj.getInt(age);// 最后输出到控制台System.out.println(name---age);} catch (JSONException e) {e.printStackTrace();}}}纯数组(Array)的解析{ }:import org.json.JSONArray;import org.json.JSONException;/*** 对纯数组Aarry的解析* author sKy°* date 2016-5-8* version 1.0*/public class Json02 {public static void main(String[] args) {// 编辑一个我们要解析的数据对象String json[天津冷,北京暖,东京热,南京凉];try {// 创建JSON解析对象(两条规则的体现:中括号用JSONArray,注意传入数据对象)JSONArray jArray new JSONArray(json);// 取得数组长度int length jArray.length();// 回想数组的取值的方式 ---for循环遍历数组---得到值for (int i 0; i length; i) {// 根据解析的数据类型使用该类型的get方法得到该值打印输出String string jArray.getString(i);System.out.print(string,);}} catch (JSONException e) {// TODO: handle exception}}}组合类型的解析(一):例子: String json”{‘name’:’李书豪’,’girlFriend’:{‘name’:’高圆圆’,’age’:18}}”;分析: 我们首先是解析外面的大括号的对象然后通过girlfFriend获取到对应的被包含的里面大括号对象。所以这里我们需要建立一个类,封装对应的数据字段根据setName ,setAge的方式在去得到对应的值/*** 创建一个Person用于接收解析数据封装对应字段* author sKy°* date 2016-5-8* version 1.0*/public class Person {// 分析我们要解析的对象根据解析对象的属性值去创建对应的属性值// 根据分析我们所要解析的对象两条属性 1.name(String类型) 2.是girlFrien(类类型,意味着还需要在类中去嵌套一个类(创建类部类也可))// 封装字段private String name;private GirlFriend girlFriend; //类类型// setter getter方法public String getName() {return name;}public void setName(String name) {this.name name;}public GirlFriend getGirlFriend() {return girlFriend;}public void setGirlFriend(GirlFriend girlFriend) {this.girlFriend girlFriend;}// toString方法用于控制台输出Overridepublic String toString() {return Person [name name , girlFriend girlFriend ];}}// 为了方便咱们看这里就直接在下面创建了一个GirlFriend这个类class GirlFriend{// 根据对象属性值创建对应的值private String name;private int age;// setter getter方法public String getName() {return name;}public void setName(String name) {this.name name;}public int getAge() {return age;}public void setAge(int age) {this.age age;}// toString方法用于控制台输出Overridepublic String toString() {return GirlFriend [name name , age age ];}}开始解析:import org.json.JSONException;import org.json.JSONObject;/*** 组合数据类型的解析---对象嵌套对象类型* author sKy°* date 2016-5-8* version 1.0*/public class Json03 {public static void main(String[] args) {// 编辑一个我们要解析的数据对象// 分析: 应该先解析外面的大的对象然后通过girlfFriend获取到对应的被包含的对象。// 所以这里我们需要建立一个类,封装对应的数据字段根据setName ,setAge的方式在去得到对应的值String json{name:李书豪,girlFriend:{name:高圆圆,age:18}};try {// 1.创建JSON解析对象(两条规则的提现:大括号用JSONObject,注意传入数据对象)JSONObject jObj new JSONObject(json);// 2.实例化Person对象获取对应的值---这里是获得外面大括号{}的name值 思考?里面{}如何获得?Person pernew Person();String name jObj.getString(name);per.setName(name);// 3.分析:里面{}是嵌套在外面大括号类的所以我们解析的对象是通过外面大括号去取得里面大括号值注意看//取得对应里面大括号的girlFriend,取得name值赋值给girlFriend对象GirlFriend girlFriendnew GirlFriend();JSONObject jObj1 jObj.getJSONObject(girlFriend);String gfName jObj1.getString(name);girlFriend.setName(gfName);// 获得age值并赋值int gfAge jObj1.getInt(age);girlFriend.setAge(gfAge);// 通过set把girlFriend的值赋Person 用于toString的输出不然为空per.setGirlFriend(girlFriend);// 输出System.out.println(per);}catch (JSONException e) {e.printStackTrace();}}}小结: [ {},{} ]–思路第一步看到大括号JSONObject去解,创建好对应里面的属性的值第二步看到中括号JSONArray去解析 对应创建好对应里面的属性值第三步中括号里面的{}又是一个JSONObject。思路大致如此强调注意的是设置的属性值setXxx getXxx必须要和去获得值名称一致不然会出错组合类型的解析(二):下面我们来解析一个略为复杂的JSON数据要解析的数据如下:{desc: OK,status: 1000,data: {wendu: 20,ganmao: 相对于今天将会出现大幅度降温易发生感冒请注意适当增加衣服加强自我防护避免感冒。,forecast: [{fengxiang: 北风,fengli: 3-4级,high: 高温 27℃,type: 中雨,low: 低温 19℃,date: 6日星期五},{fengxiang: 北风,fengli: 微风级,high: 高温 23℃,type: 大雨,low: 低温 17℃,date: 7日星期六},{fengxiang: 北风,fengli: 微风级,high: 高温 26℃,type: 小雨,low: 低温 17℃,date: 8日星期天},{fengxiang: 南风,fengli: 微风级,high: 高温 27℃,type: 多云,low: 低温 15℃,date: 9日星期一},{fengxiang: 南风,fengli: 微风级,high: 高温 29℃,type: 多云,low: 低温 16℃,date: 10日星期二}],yesterday: {fl: 微风,fx: 北风,high: 高温 33℃,type: 阴,low: 低温 22℃,date: 5日星期四},aqi: 58,city: 成都}}分析一:第一个大括号(JSONObject)”desc”: “status”: “data”二大括号里面有一个大括号(JSONObject)”wendu”: “20”, “ganmao”: “forecast”: “yesterday”: “aqi”: “city”: 三第二个大括号里面有两个对象 1.数组形JSONArray 2.对象形( JSONObject )而数组形里面又套有数组的对象{} 。这就需要咱们在解析的时候需要很细致的去创建对应的属性值JSON解析并不难而难受的地方就提现在对类的创建中只要够细心也超简单开始封装字段import java.util.List;/*** 对应的字段的封装* author sKy°* date 2016-5-6* version 1.0*/public class Weather {// 外面大括号的字段封装 setter getter toStringpublic String desc;public int status;public Data data;Overridepublic String toString() {return Weather [desc desc , status status , data data ];}}class Data{// 里面大括号的字段封装 setter getter toString// 该类中包含有数组形和对象形需要一并的封装在里面public String wendu;public String ganmao;public ListForecast forecast;public Yesterday yesterday;public String aqi;public String city;Overridepublic String toString() {return Data [wendu wendu , ganmao ganmao , forecast forecast , yesterday yesterday , aqi aqi , city city ];}}class Forecast{// 数组里面的大括号类型字段的封装public String fengxiang;public String fengli;public String high;public String type;public String low;public String date;Overridepublic String toString() {return Forecast [fengxiang fengxiang , fengli fengli , high high , type type , low low , date date ];}}class Yesterday{// 最后{}的字段封装public String fl;public String fx;public String high;public String type;public String low;public String date;Overridepublic String toString() {return Yesterday [fl fl , fx fx , high high , type type , low low , date date ];}}开始解析import java.util.ArrayList;import java.util.List;import org.json.JSONArray;import org.json.JSONException;import org.json.JSONObject;/*** 组合类型二的解析* author sKy°* date 2016-5-6* version 1.0*/public class Test01 {public static void main(String[] args) throws Exception {//要解析的对象String json{ desc: OK, status: 1000, data: { wendu: 20, ganmao: 相对于今天将会出现大幅度降温易发生感冒请注意适当增加衣服加强自我防护避免感冒。, forecast: [ { fengxiang: 北风, fengli: 3-4级, high: 高温 27℃, type: 中雨, low: 低温 19℃, date: 6日星期五 }, { fengxiang: 北风, fengli: 微风级, high: 高温 23℃, type: 大雨, low: 低温 17℃, date: 7日星期六 }, { fengxiang: 北风, fengli: 微风级, high: 高温 26℃, type: 小雨, low: 低温 17℃, date: 8日星期天 }, { fengxiang: 南风, fengli: 微风级, high: 高温 27℃, type: 多云, low: 低温 15℃, date: 9日星期一 }, { fengxiang: 南风, fengli: 微风级, high: 高温 29℃, type: 多云, low: 低温 16℃, date: 10日星期二 } ], yesterday: { fl: 微风, fx: 北风, high: 高温 33℃, type: 阴, low: 低温 22℃, date: 5日星期四 }, aqi: 58, city: 成都 } };Weather weanew Weather();// 首先看到的是一个{}所以用JSON Object来进行解析// 获得外部的WeatherJSONObject obj new JSONObject(json);String desc obj.getString(desc);int status obj.getInt(status);wea.statusstatus;wea.descdesc;// 获得内部Data的数据JSONObject obj1 obj.getJSONObject(data);Data datanew Data();data.wenduobj1.getString(wendu);data.ganmaoobj1.getString(ganmao);data.aqiobj1.getString(aqi);data.cityobj1.getString(city);wea.datadata;ListForecast forecastsnew ArrayList();// 获取forecast数组JSONArray jArr obj1.getJSONArray(forecast);for (int i 0; i jArr.length(); i) {JSONObject obj2 jArr.getJSONObject(i);Forecast forecastnew Forecast();forecast.dateobj2.getString(date);forecast.fengxiangobj2.getString(fengxiang);forecast.highobj2.getString(high);forecast.lowobj2.getString(low);forecast.fengliobj2.getString(fengli);forecast.typeobj2.getString(type);forecasts.add(forecast);}data.forecastforecasts;JSONObject obj3 obj1.getJSONObject(yesterday);Yesterday yesterdaynew Yesterday();yesterday.flobj3.getString(fl);yesterday.fxobj3.getString(fx);yesterday.highobj3.getString(high);yesterday.typeobj3.getString(type);yesterday.lowobj3.getString(low);yesterday.dateobj3.getString(date);data.yesterdayyesterday;// 输出字段System.out.println(wea);}}