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.ArrayList
import java.util.List
import org.json.JSONArray
import org.json.JSONException
import org.json.JSONObject
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 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对象,后面解析思路也是如此,写的不好的地方大家包涵!有啥问题,欢迎留言!)