我们要学习使用JSON解析,必须对JSON解析的规则原理有深刻的认识和了解,然后才知道它的一个实现原理
JSON里面的数据是以一种键值对的方式存在
(”key”:”value”)中值的类型可以是下面数据类型中的任意一种:
1. 数字(整数或浮点数)
2. 逻辑值(true 或 false)
3. 字符串(在双引号中)
4. 数组(在方括号中)
5. 函数
6. 对象(在大括号中)
7. null
JSON的语法规则非常的简单,就是使用
大括号’{}’,
中括号’[]’,
逗号’,’,
冒号’:’,
双引号’“”’。
数据类型:
嵌套对象、数组、字符串、数字、布尔值或空值。
我们在JSON解析中只有三中情况出现
1.{} 解析’大括号’类型
2. [ ] 解析是’中括号’类型
3. 其实只有两种,那第三种则是1与2的组合方法即”{’name’:’李书豪’ ,’hobby’:[‘编程’,’电竞’,’睡觉’]}”那么下面分别来看一些这三种类型以及解析
JSON解析一定要掌握的两条规则:
掌握了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 = String("name");
// 同理如上,这里的age为Int类型,我们就用对应的类型进行解析int age = Int("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 = String(i);System.out.print(string+",");}} catch (JSONException e) {// TODO: handle exception}}
}
组合类型的解析(一):
/*** 创建一个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 per=new Person();String name = String("name");per.setName(name);
// 3.分析:里面{}是嵌套在外面大括号类的所以我们解析的对象是通过外面大括号去取得里面大括号值,注意看//取得对应里面大括号的girlFriend,取得name值,赋值给girlFriend对象GirlFriend girlFriend=new GirlFriend();JSONObject jObj1 = JSONObject("girlFriend");String gfName = String("name");girlFriend.setName(gfName);
// 获得age值并赋值int gfAge = Int("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在线解析工具/ 这是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 {
// 外面大括号的字段封装 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 List<Forecast> 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 wea=new Weather();
// 首先看到的是一个{}所以用JSON Object来进行解析
// 获得外部的WeatherJSONObject obj = new JSONObject(json);String desc = String("desc");int status = Int("status");wea.status=status;wea.desc=desc;// 获得内部Data的数据JSONObject obj1 = JSONObject("data");Data data=new Data();data.wenduString("wendu");data.ganmaoString("ganmao");data.aqiString("aqi");data.cityString("city");wea.data=data;List<Forecast> forecasts=new ArrayList<>();// 获取forecast数组JSONArray jArr = JSONArray("forecast");for (int i = 0; i < jArr.length(); i++) {JSONObject obj2 = JSONObject(i);Forecast forecast=new Forecast();forecast.dateString("date");forecast.fengxiangString("fengxiang");forecast.highString("high");forecast.lowString("low");forecast.fengliString("fengli");peString("type");forecasts.add(forecast);}data.forecast=forecasts;JSONObject obj3 = JSONObject("yesterday");Yesterday yesterday=new Yesterday();yesterday.flString("fl");yesterday.fxString("fx");yesterday.highString("high");peString("type");yesterday.lowString("low");yesterday.dateString("date");sterday=yesterday;// 输出字段System.out.println(wea);}
解析结果:
结语: 对于JSON解析个人的粗浅看法,
1.首先是对JSON数据的一个分析
2.其次是掌握JSON一些技巧(两条规则–对象形JSONObject ,数组形JSONArray)
3.而后是对对应的属性值进行对应的字段封装建立对应的类(分析要细心,思路要清晰,程序这行需要有耐心不能浮躁)
4.而后是解析中要有明确的思路
(以上只是一个JSON初步的解析,但JSON解析的大致思路如此,后面有http套用的,无非也就把下载的文件转为JSON对象,后面解析思路也是如此,写的不好的地方大家包涵!有啥问题,欢迎留言!)
本文发布于:2024-02-04 12:47:35,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170707599455708.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |