JSON简介
- JAVAScript Object Notation是一种轻量级的数据交换格式
- 具有良好的可读和便于快速编写的特性。
- 业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的支持)
- JSON采用兼容性很高的文本格式,同时也具备类似于C语言体系的行为。 – Json.org
- JSON作为数据是目前网络中主流的数据传输格式之一,应用十分广泛,说是使用率达到99%一点也不勉强
JSON支持的数据类型
我们要学习使用JSON解析,必须对JSON解析的规则原理有深刻的认识和了解,然后才知道它的一个实现原理
JSON里面的数据是以一种键值对的方式存在
(”key”:”value”)中值的类型可以是下面数据类型中的任意一种:
1. 数字(整数或浮点数)
2. 逻辑值(true 或 false)
3. 字符串(在双引号中)
4. 数组(在方括号中)
5. 函数
6. 对象(在大括号中)
7. null
JSON语法规则
JSON的语法规则非常的简单,就是使用
大括号’{}’,
中括号’[]’,
逗号’,’,
冒号’:’,
双引号’“”’。
数据类型:
嵌套对象、数组、字符串、数字、布尔值或空值。
我们在JSON解析中只有三中情况出现
1.{} 解析’大括号’类型
2. [ ] 解析是’中括号’类型
3. 其实只有两种,那第三种则是1与2的组合方法即”{’name’:’李书豪’ ,’hobby’:[‘编程’,’电竞’,’睡觉’]}”那么下面分别来看一些这三种类型以及解析
JSON基本语法与图例
- Object(对象类型)
- 用{ }包含一系列无序的key–Value键值对表示,其中Key和Value之间用冒号分割,每个key-value之间用逗号分割。
- 比如:
- Array(数组类型)
- 使用[ ]包含所有元素,每个元素用逗号分隔,元素可以是任意的值
- 比如:
- 组合形
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) { String json="{'name':'李书豪','age':24}"; try { JSONObject obj = new JSONObject(json); String name = obj.getString("name"); int age = obj.getInt("age"); System.out.println(name+"<--->"+age); } catch (JSONException e) { e.printStackTrace(); } }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
纯数组(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 { JSONArray jArray = new JSONArray(json); int length = jArray.length(); for (int i = 0; i < length; i++) { String string = jArray.getString(i); System.out.print(string+","); } } catch (JSONException e) { } }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
组合类型的解析(一):
- 例子: String json=”{‘name’:’李书豪’,’girlFriend’:{‘name’:’高圆圆’,’age’:18}}”;
- 分析: 我们首先是解析外面的大括号的对象,然后,通过girlfFriend,获取到对应的被包含的里面大括号对象。所以这里我们需要建立一个类,封装对应的数据字段,根据setName ,setAge的方式在去得到对应的值
/** * 创建一个Person用于接收解析数据,封装对应字段 * @author sKy° * @date 2016-5-8 * @version 1.0 */public class Person { private String name; private GirlFriend girlFriend; 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; } @Override public String toString() { return "Person [name=" + name + ", girlFriend=" + girlFriend + "]"; }}class GirlFriend{ private String name; private int age; 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; } @Override public String toString() { return "GirlFriend [name=" + name + ", age=" + age + "]"; }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
开始解析:
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) { String json="{'name':'李书豪','girlFriend':{'name':'高圆圆','age':18}}"; try { JSONObject jObj = new JSONObject(json); Person per=new Person(); String name = jObj.getString("name"); per.setName(name); GirlFriend girlFriend=new GirlFriend(); JSONObject jObj1 = jObj.getJSONObject("girlFriend"); String gfName = jObj1.getString("name"); girlFriend.setName(gfName); int gfAge = jObj1.getInt("age"); girlFriend.setAge(gfAge); per.setGirlFriend(girlFriend); System.out.println(per); }catch (JSONException e) { e.printStackTrace(); } }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
小结: {[ {},{} ]}–>思路:第一步看到大括号: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': '成都' }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
因为数据略大,不方便咱们看,这里给大家提供一个JSON在线解析工具http://json.phpddt.com/ 这是JSON在线高亮解析 ,可以很好的帮助咱们进行解析分析。下面是我用网页解析好的图片,可以思考下步骤(记住两条规则)
分析:
一:第一个大括号(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 { public String desc; public int status; public Data data; @Override public String toString() { return "Weather [desc=" + desc + ", status=" + status + ", data=" + data + "]"; }}class Data{ public String wendu; public String ganmao; public List<Forecast> forecast; public Yesterday yesterday; public String aqi; public String city; @Override public 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; @Override public 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; @Override public String toString() { return "Yesterday [fl=" + fl + ", fx=" + fx + ", high=" + high + ", type=" + type + ", low=" + low + ", date=" + date + "]"; }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
开始解析:
import java.util.ArrayListimport java.util.Listimport org.json.JSONArrayimport org.json.JSONExceptionimport org.json.JSONObjectpublic 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 wea=new Weather()// 首先看到的是一个{}所以用JSON Object来进行解析// 获得外部的Weather JSONObject obj = new JSONObject(json) String desc = obj.getString("desc") int status = obj.getInt("status") wea.status=status wea.desc=desc// 获得内部Data的数据 JSONObject obj1 = obj.getJSONObject("data") Data data=new Data() data.wendu=obj1.getString("wendu") data.ganmao=obj1.getString("ganmao") data.aqi=obj1.getString("aqi") data.city=obj1.getString("city") wea.data=data List<Forecast> forecasts=new ArrayList<>()// 获取forecast数组 JSONArray jArr = obj1.getJSONArray("forecast") for (int i = 0 JSONObject obj2 = jArr.getJSONObject(i) Forecast forecast=new Forecast() forecast.date=obj2.getString("date") forecast.fengxiang=obj2.getString("fengxiang") forecast.high=obj2.getString("high") forecast.low=obj2.getString("low") forecast.fengli=obj2.getString("fengli") forecast.type=obj2.getString("type") forecasts.add(forecast) } data.forecast=forecasts JSONObject obj3 = obj1.getJSONObject("yesterday") Yesterday yesterday=new Yesterday() yesterday.fl=obj3.getString("fl") yesterday.fx=obj3.getString("fx") yesterday.high=obj3.getString("high") yesterday.type=obj3.getString("type") yesterday.low=obj3.getString("low") yesterday.date=obj3.getString("date") data.yesterday=yesterday// 输出字段 System.out.println(wea) }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
解析结果:
结语: 对于JSON解析个人的粗浅看法,
1.首先是对JSON数据的一个分析
2.其次是掌握JSON一些技巧(两条规则–对象形JSONObject ,数组形JSONArray)
3.而后是对对应的属性值进行对应的字段封装建立对应的类(分析要细心,思路要清晰,程序这行需要有耐心不能浮躁)
4.而后是解析中要有明确的思路
(以上只是一个JSON初步的解析,但JSON解析的大致思路如此,后面有http套用的,无非也就把下载的文件转为JSON对象,后面解析思路也是如此,写的不好的地方大家包涵!有啥问题,欢迎留言!)