来自:zgmcrf > 馆藏分类
配色: 字号:
超详细JSON解析步骤
2018-01-07 | 阅:  转:  |  分享 
  
超详细JSON解析步骤转载?2016年09月19日14:58:56标签:http://so.csdn.net/so/search/s.do
?q=Json%E8%A7%A3%E6%9E%90%E6%AD%A5%E9%AA%A4&t=blogJson解析步骤12484JS
ON简介JAVAScriptObjectNotation是一种轻量级的数据交换格式具有良好的可读和便于快速编写的特性。业内主流
技术为其提供了完整的解决方案(有点类似于正则表达式,获得了当今大部分语言的支持)JSON采用兼容性很高的文本格式,同时也具备类似
于C语言体系的行为。–Json.orgJSON作为数据是目前网络中主流的数据传输格式之一,应用十分广泛,说是使用率达到99%一
点也不勉强JSON支持的数据类型我们要学习使用JSON解析,必须对JSON解析的规则原理有深刻的认识和了解,然后才知道它的一个实现
原理?JSON里面的数据是以一种键值对的方式存在?(”key”:”value”)中值的类型可以是下面数据类型中的任意一种:?1.
数字(整数或浮点数)?2.逻辑值(true或false)?3.字符串(在双引号中)?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)的解析{}:[java]?http://blog.csdn.ne
t/miaozhenzhong/article/details/52585726viewplain?http://blog.cs
dn.net/miaozhenzhong/article/details/52585726copyimport?org.json.
JSONException;??import?org.json.JSONObject;???/???JSON-->纯对象(O
bject)的解析??????注:我们在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?(JSONExcep
tion?e)?{???e.printStackTrace();???}????}??}??纯数组(Array)的解析{}:[j
ava]?http://blog.csdn.net/miaozhenzhong/article/details/52585726v
iewplain?http://blog.csdn.net/miaozhenzhong/article/details/5258
5726copyimport?org.json.JSONArray;??import?org.json.JSONException
;???/???对纯数组Aarry的解析???@author?sKy°???@date?2016-5-8???@ver
sion?1.0??/?public?class?Json02?{???public?static?void?main(Stri
ng[]?args)?{??//编辑一个我们要解析的数据对象??String?json="[''天津冷'',''北京暖'',''东京热'',''
南京凉'']";????try?{??//创建JSON解析对象(两条规则的体现:中括号用JSONArray,注意传入数据对象)??J
SONArray?jArray?=?new?JSONArray(json);??//取得数组长度??int?length?=?jA
rray.length();??//回想数组的取值的方式??--->for循环遍历数组--->得到值??for?(int?i?=?
0;?i?ring?=?jArray.getString(i);???System.out.print(string+",");???}??
??}?catch?(JSONException?e)?{???//?TODO:?handle?exception??}?????
}??}??组合类型的解析(一):例子:Stringjson=”{‘name’:’李书豪’,’girlFriend’:{‘na
me’:’高圆圆’,’age’:18}}”;分析:我们首先是解析外面的大括号的对象,然后,通过girlfFriend,获取到对应
的被包含的里面大括号对象。所以这里我们需要建立一个类,封装对应的数据字段,根据setName,setAge的方式在去得到对应的值
[java]?http://blog.csdn.net/miaozhenzhong/article/details/5258572
6viewplain?http://blog.csdn.net/miaozhenzhong/article/details/52
585726copy/???创建一个Person用于接收解析数据,封装对应字段???@author?sKy°???@da
te?2016-5-8???@version?1.0??/?public?class?Person?{??//分析我们要解析的
对象,根据解析对象的属性值去创建对应的属性值?//根据分析我们所要解析的对象,两条属性?1.name(String类型)?2.是g
irlFrien(类类型,意味着还需要在类中去嵌套一个类(创建类部类也可))??//封装字段??private?String?na
me;???private?GirlFriend?girlFriend;??//类类型?//???setter?getter方法?
?public?String?getName()?{???return?name;???}???public?void?setNa
me(String?name)?{???this.name?=?name;???}???public?GirlFriend?get
GirlFriend()?{???return?girlFriend;???}???public?void?setGirlFrie
nd(GirlFriend?girlFriend)?{???this.girlFriend?=?girlFriend;???}??
?//toString方法用于控制台输出??@Override??public?String?toString()?{???ret
urn?"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;???}???publ
ic?int?getAge()?{???return?age;???}???public?void?setAge(int?age)
?{???this.age?=?age;???}??//toString方法用于控制台输出??@Override??public?
String?toString()?{???return?"GirlFriend?[name="?+?name?+?",?age=
"?+?age?+?"]";???}?????}??开始解析:[java]?http://blog.csdn.net/miaozh
enzhong/article/details/52585726viewplain?http://blog.csdn.net/m
iaozhenzhong/article/details/52585726copyimport?org.json.JSONExce
ption;??import?org.json.JSONObject;???????/???组合数据类型的解析--->对象嵌
套对象类型???@author?sKy°???@date?2016-5-8???@version?1.0??/?publi
c?class?Json03?{???public?static?void?main(String[]?args)?{??//编辑
一个我们要解析的数据对象?//分析:?应该先解析外面的大的对象,然后,通过girlfFriend,获取到对应的被包含的对象。?//
所以这里我们需要建立一个类,封装对应的数据字段,根据setName?,setAge的方式在去得到对应的值???String?jso
n="{''name'':''李书豪'',''girlFriend'':{''name'':''高圆圆'',''age'':18}}";???try?{?
?//??????????1.创建JSON解析对象(两条规则的提现:大括号用JSONObject,注意传入数据对象)??JSONO
bject?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("girlFr
iend");???String?gfName?=?jObj1.getString("name");???girlFriend.s
etName(gfName);??//获得age值并赋值??int?gfAge?=?jObj1.getInt("age");???
girlFriend.setAge(gfAge);??//通过set把girlFriend的值赋Person?用于toString
的输出,不然为空??per.setGirlFriend(girlFriend);??//输出??System.out.printl
n(per);???}catch?(JSONException?e)?{???e.printStackTrace();???}??
?}??}???小结:{[{},{}]}–>思路:第一步看到大括号:JSONObject去解,创建好对应里面的属性的值;第二
步看到中括号:JSONArray去解析对应创建好对应里面的属性值;第三步中括号里面的{},又是一个JSONObject。思路大致
如此,强调注意的是,设置的属性值setXxxgetXxx必须要和去获得值名称一致,不然会出错!!组合类型的解析(二):下面我们来
解析一个略为复杂的JSON数据?要解析的数据如下:[java]?http://blog.csdn.net/miaozhenzhon
g/article/details/52585726viewplain?http://blog.csdn.net/miaozhe
nzhong/article/details/52585726copy{???''desc'':?''OK'',???''status'':?
1000,???''data'':?{???''wendu'':?''20'',???''ganmao'':?''相对于今天将会出现大幅度降温,易发
生感冒,请注意适当增加衣服,加强自我防护避免感冒。'',???''forecast'':?[???{???''fengxiang'':?''北
风'',???''fengli'':?''3-4级'',???''high'':?''高温?27℃'',???''type'':?''中雨'',???''lo
w'':?''低温?19℃'',???''date'':?''6日星期五''??},???{???''fengxiang'':?''北风'',???''f
engli'':?''微风级'',???''high'':?''高温?23℃'',???''type'':?''大雨'',???''low'':?''低温?1
7℃'',???''date'':?''7日星期六''??},???{???''fengxiang'':?''北风'',???''fengli'':?''
微风级'',???''high'':?''高温?26℃'',???''type'':?''小雨'',???''low'':?''低温?17℃'',???''d
ate'':?''8日星期天''??},???{???''fengxiang'':?''南风'',???''fengli'':?''微风级'',???''
high'':?''高温?27℃'',???''type'':?''多云'',???''low'':?''低温?15℃'',???''date'':?''9日
星期一''??},???{???''fengxiang'':?''南风'',???''fengli'':?''微风级'',???''high'':?''高
温?29℃'',???''type'':?''多云'',???''low'':?''低温?16℃'',???''date'':?''10日星期二''??}?
??],???''yesterday'':?{???''fl'':?''微风'',???''fx'':?''北风'',???''high'':?''高温?3
3℃'',???''type'':?''阴'',???''low'':?''低温?22℃'',???''date'':?''5日星期四''??},???''a
qi'':?''58'',???''city'':?''成都''??}??}??因为数据略大,不方便咱们看,这里给大家提供一个JSON在线解析工
具http://json.phpddt.com/?这是JSON在线高亮解析,可以很好的帮助咱们进行解析分析。下面是我用网页解析好
的图片,可以思考下步骤(记住两条规则)?分析:??一:第一个大括号(JSONObject){”desc”:“status”:“
data”}?二:大括号里面有一个大括号(JSONObject){”wendu”:“20”,“ganmao”:“foreca
st”:“yesterday”:“aqi”:“city”:}?三:第二个大括号里面有两个对象1.数组形(JSONArra
y)2.对象形(JSONObject)?而数组形里面又套有数组的对象{}。这就需要咱们在解析的时候需要很细致的去创建对应的
属性值,JSON解析并不难,而难受的地方就提现在对类的创建中,只要够细心也超简单!开始封装字段:[java]?http://blo
g.csdn.net/miaozhenzhong/article/details/52585726viewplain?http:
//blog.csdn.net/miaozhenzhong/article/details/52585726copyimport?
java.util.List;???/???对应的字段的封装???@author?sKy°???@date?2016-5
-6???@version?1.0??/?public?class?Weather?{??//??外面大括号的字段封装?set
ter?getter?toString??public?String?desc;???public?int?status;???p
ublic?Data?data;???@Override??public?String?toString()?{???return
?"Weather?[desc="?+?desc?+?",?status="?+?status?+?",?data="??+?da
ta?+?"]";???}????}???class?Data{??//??里面大括号的字段封装?setter?getter?to
String??//??该类中包含有数组形和对象形,需要一并的封装在里面??public?String?wendu;???publ
ic?String?ganmao;???public?List?forecast;???public?Yest
erday?yesterday;???public?String?aqi;???public?String?city;???@Ov
erride??public?String?toString()?{???return?"Data?[wendu="?+?wend
u?+?",?ganmao="?+?ganmao?+?",?forecast="??+?forecast?+?",?yesterd
ay="?+?yesterday?+?",?aqi="?+?aqi???+?",?city="?+?city?+?"]";???}
????}???class?Forecast{??//??数组里面的大括号类型字段的封装??public?String?fengx
iang;???public?String?fengli;???public?String?high;???public?Stri
ng?type;?public?String?low;???public?String?date;???@Override??pu
blic?String?toString()?{???return?"Forecast?[fengxiang="?+?fengxi
ang?+?",?fengli="?+?fengli???+?",?high="?+?high?+?",?type="?+?typ
e?+?",?low="?+?low???+?",?date="?+?date?+?"]";???}????}??class?Ye
sterday{??//最后{}的字段封装??public?String?fl;???public?String?fx;???pu
blic?String?high;???public?String?type;???public?String?low;???pu
blic?String?date;???@Override??public?String?toString()?{???retur
n?"Yesterday?[fl="?+?fl?+?",?fx="?+?fx?+?",?high="?+?high???+?",?
type="?+?type?+?",?low="?+?low?+?",?date="?+?date?+?"]";???}???}?
?开始解析:[java]?http://blog.csdn.net/miaozhenzhong/article/details/5
2585726viewplain?http://blog.csdn.net/miaozhenzhong/article/deta
ils/52585726copyimport?java.util.ArrayList;??import?java.util.Lis
t;???import?org.json.JSONArray;??import?org.json.JSONException;??
import?org.json.JSONObject;??????/???组合类型二的解析???@author?sKy°?
??@date?2016-5-6???@version?1.0??/?public?class?Test01?{???pub
lic?static?void?main(String[]?args)?throws?Exception?{????//要解析的对
象??String?json="{?''desc'':?''OK'',?''status'':?1000,?''data'':?{?''wendu''
:?''20'',?''ganmao'':?''相对于今天将会出现大幅度降温,易发生感冒,请注意适当增加衣服,加强自我防护避免感冒。'',?''
forecast'':?[?{?''fengxiang'':?''北风'',?''fengli'':?''3-4级'',?''high'':?''高温?2
7℃'',?''type'':?''中雨'',?''low'':?''低温?19℃'',?''date'':?''6日星期五''?},?{?''fengxia
ng'':?''北风'',?''fengli'':?''微风级'',?''high'':?''高温?23℃'',?''type'':?''大雨'',?''low''
:?''低温?17℃'',?''date'':?''7日星期六''?},?{?''fengxiang'':?''北风'',?''fengli'':?''微风
级'',?''high'':?''高温?26℃'',?''type'':?''小雨'',?''low'':?''低温?17℃'',?''date'':?''8日星
期天''?},?{?''fengxiang'':?''南风'',?''fengli'':?''微风级'',?''high'':?''高温?27℃'',?''t
ype'':?''多云'',?''low'':?''低温?15℃'',?''date'':?''9日星期一''?},?{?''fengxiang'':?''南
风'',?''fengli'':?''微风级'',?''high'':?''高温?29℃'',?''type'':?''多云'',?''low'':?''低温?1
6℃'',?''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");???i
nt?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.getStrin
g("aqi");???data.city=obj1.getString("city");???wea.data=data;???
List?forecasts=new?ArrayList<>();???//获取forecast数组??JSO
NArray?jArr?=?obj1.getJSONArray("forecast");???for?(int?i?=?0;?i?
;???Forecast?forecast=new?Forecast();???forecast.date=obj2.getStr
ing("date");???forecast.fengxiang=obj2.getString("fengxiang");???
forecast.high=obj2.getString("high");???forecast.low=obj2.getStri
ng("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);???}??解析结果:结语:对于JSON解析个人的粗浅看法,?1.首先是对JSON数据的一个分析?2.其次是掌握JSON一些技巧(两条规则–对象形JSONObject,数组形JSONArray)?3.而后是对对应的属性值进行对应的字段封装建立对应的类(分析要细心,思路要清晰,程序这行需要有耐心不能浮躁)?4.而后是解析中要有明确的思路(以上只是一个JSON初步的解析,但JSON解析的大致思路如此,后面有http套用的,无非也就把下载的文件转为JSON对象,后面解析思路也是如此,写的不好的地方大家包涵!有啥问题,欢迎留言!)
献花(0)
+1
(本文系zgmcrf首藏)