JSON数据解析
-
JSON解析一定要掌握的两条规则:
- 1.如果看到是{ }–>使用JSONObject
- 2.如果看到的[ ]–>使用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方法用于控制台输出
@Override
public 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方法用于控制台输出
@Override
public 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 per=new Person();
-
String name = jObj.getString("name");
-
per.setName(name);
-
// 3.分析:里面{}是嵌套在外面大括号类的所以我们解析的对象是通过外面大括号去取得里面大括号值,注意看
-
//取得对应里面大括号的girlFriend,取得name值,赋值给girlFriend对象
-
GirlFriend girlFriend=new 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': '成都'
-
}
-
}
因为数据略大,不方便咱们看,这里给大家提供一个JSON在线解析工具http://json.phpddt.com/ 这是JSON在线高亮解析 ,可以很好的帮助咱们进行解析分析。下面是我用网页解析好的图片,可以思考下步骤(记住两条规则)
分析:
一:第一个大括号(JSONObject){”desc”: “status”: “data”}
二:大括号里面有一个大括号(JSONObject){”wendu”: “20”, “ganmao”: “forecast”: “yesterday”: “aqi”: “city”: }
三:第二个大括号里面有两个对象 1.数组形(JSONArray) 2.对象形( JSONObject )
而数组形里面又套有数组的对象{} 。这就需要咱们在解析的时候需要很细致的去创建对应的属性值,JSON解析并不难,而难受的地方就提现在对类的创建中,只要够细心也超简单!
-
// 里面大括号的字段封装 setter getter toString
-
// 该类中包含有数组形和对象形,需要一并的封装在里面
-
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 + "]";
-
}
-
}
开始解析:
{ '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': '成都' } }