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数据解析

  • 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解析并不难,而难受的地方就提现在对类的创建中,只要够细心也超简单!

开始封装字段
import java.util.List;

/**
* 对应的字段的封装
* @author sKy°
* @date 2016-5-6
* @version 1.0
*/
public class Weather {
// 外面大括号的字段封装 setter getter toString
public String desc;
public int status;
public Data data;
@Override
public 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;
@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 + "]";
} }

开始解析:

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来进行解析
// 获得外部的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; i < jArr.length(); i++) {
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);
} }

解析结果:

结语: 对于JSON解析个人的粗浅看法,
1.首先是对JSON数据的一个分析
2.其次是掌握JSON一些技巧(两条规则–对象形JSONObject ,数组形JSONArray)
3.而后是对对应的属性值进行对应的字段封装建立对应的类(分析要细心,思路要清晰,程序这行需要有耐心不能浮躁)
4.而后是解析中要有明确的思路

(以上只是一个JSON初步的解析,但JSON解析的大致思路如此,后面有http套用的,无非也就把下载的文件转为JSON对象,后面解析思路也是如此,写的不好的地方大家包涵!有啥问题,欢迎留言!)

超详细JSON解析步骤的更多相关文章

  1. AbstractQueuedSynchronizer(AQS) 超详细原理解析

    java.util.concurrent包中很多类都依赖于这个类AbstractQueuedSynchronizer所提供的队列式的同步器,比如说常用的ReentranLock,Semaphore和C ...

  2. 【算法】禁忌搜索算法(Tabu Search,TS)超详细通俗解析附C++代码实例

    01 什么是禁忌搜索算法? 1.1 先从爬山算法说起 爬山算法从当前的节点开始,和周围的邻居节点的值进行比较. 如果当前节点是最大的,那么返回当前节点,作为最大值 (既山峰最高点):反之就用最高的邻居 ...

  3. iOS开发之JSON解析

    JSON解析步骤: - (NSArray *)products { if (_products == nil) { //第一步:获取JSON文件的路径: NSString *path = [[NSBu ...

  4. centos7安装zabbix3.0超详细步骤解析

    centos7安装zabbix3.0超详细步骤解析 很详细,感谢作者 以下是我操作的history 622 java -version 623 javac -version 624 grep SELI ...

  5. 超详细的Guava RateLimiter限流原理解析

    超详细的Guava RateLimiter限流原理解析  mp.weixin.qq.com 点击上方“方志朋”,选择“置顶或者星标” 你的关注意义重大! 限流是保护高并发系统的三把利器之一,另外两个是 ...

  6. 【公众号系列】超详细SAP HANA JOB全解析

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[公众号系列]超详细SAP HANA JOB全解 ...

  7. MP3文件结构解析(超详细)

    转自:http://blog.csdn.net/u010650845/article/details/53520426 MP3文件结构解析(超详细) 1. MP3文件结构解析 1.1. 概述 1.1. ...

  8. (转)超详细单机版搭建hadoop环境图文解析

                        超详细单机版搭建hadoop环境图文解析   安装过程: 一.安装Linux操作系统 二.在Ubuntu下创建hadoop用户组和用户 三.在Ubuntu下安装 ...

  9. GoJS超详细入门(插件使用无非:引包、初始化、配参数(json)、引数据(json)四步)

    GoJS超详细入门(插件使用无非:引包.初始化.配参数(json).引数据(json)四步) 一.总结 一句话总结:插件使用无非:引包.初始化.配参数(json).引数据(json)四步. 1.goj ...

随机推荐

  1. [转]基于Oracle的EntityFramework的WEBAPI2的实现(一)——准备工作

    基于Oracle的EntityFramework的WEBAPI2的实现(一)——准备工作  转载请注明作者及来源:张峻崎,博客园 目前在.net的范围内,好的而且方便的ORM的真的不是很多,与VS集成 ...

  2. java之序列化与反序列化

    1.这里主要是介绍Protobuf提供的序列化与反序列化的高效性.相对于传统的java提供的序列化来说,Protobuf的效率提高了很多倍.但是也有不足的地方,就是proto在对象序列化的时候抛弃了很 ...

  3. 图搜索——使用DFS和BFS耗时比较

    图测试数据生成代码: #include<bits/stdc++.h> using namespace std; int random(int mod) { return rand() % ...

  4. 清除MAC 可清除空间

    一.首先:查到了官方解释 https://support.apple.com/zh-cn/HT202867官方说 在 macOS Sierra 中,当您打开优化 Mac 储存空间时,会显示“可清除”内 ...

  5. 【好文转帖】控制反转(IOC)和依赖注入(DI)的区别

    IOC   inversion of control  控制反转 DI   Dependency Injection  依赖注入 要理解这两个概念,首先要搞清楚以下几个问题: 参与者都有谁? 依赖:谁 ...

  6. django单表操作,增、删、改、查

    一.实现:增.删.改.查 1.获取所有数据显示在页面上 model.Classes.object.all(),拿到数据后,渲染给前端;前端通过for循环的方式,取出数据. 目的:通过classes(班 ...

  7. leetcode814

    class Solution { public: TreeNode* pruneTree(TreeNode* root) { if(root==NULL) { return nullptr; } if ...

  8. MyEclipse 生成APK文件

    MyEclipse 生成APK文件 Android Tools>Export  Signed  Application Packages. http://jingyan.baidu.com/ar ...

  9. IOS调试技巧:当程序崩溃的时候怎么办 xcode调试

    转自:http://www.ityran.com/archives/1143 ------------------------------------------------ 欢迎回到当程序崩溃的时候 ...

  10. Git--时光穿梭机之删除文件06

    在Git中,删除也是一个修改操作,我们实际操作一下吧,先添加一个文件test.txt到Git并且提交 $ git add test.txt $ git commit -m "add test ...