JSON解析
JSON简介JAVAScript Object Notation是一种轻量级的数据交换格式具有良好的可读和便于快速编写的特性。业内主流技术为其提供了完整的解决方案有点类似于正则表达式 获得了当今大部分语言的支持JSON采用兼容性很高的文本格式同时也具备类似于C语言体系的行为。 – Json.orgJSON作为数据是目前网络中主流的数据传输格式之一应用十分广泛JSON支持的数据类型我们要学习使用JSON解析必须对JSON解析的规则原理有深刻的认识和了解然后才知道它的一个实现原理JSON里面的数据是以一种键值对的方式存在”key”:”value”中值的类型可以是下面数据类型中的任意一种1. 数字整数或浮点数2. 逻辑值true 或 false3. 字符串在双引号中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)的解析{ }: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方法用于控制台输出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 pernew Person();String name jObj.getString(name);per.setName(name);// 3.分析:里面{}是嵌套在外面大括号类的所以我们解析的对象是通过外面大括号去取得里面大括号值注意看//取得对应里面大括号的girlFriend,取得name值赋值给girlFriend对象GirlFriend girlFriendnew 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: 成都}}分析一:第一个大括号(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 ListForecast 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 weanew Weather();// 首先看到的是一个{}所以用JSON Object来进行解析// 获得外部的WeatherJSONObject obj new JSONObject(json);String desc obj.getString(desc);int status obj.getInt(status);wea.statusstatus;wea.descdesc;// 获得内部Data的数据JSONObject obj1 obj.getJSONObject(data);Data datanew Data();data.wenduobj1.getString(wendu);data.ganmaoobj1.getString(ganmao);data.aqiobj1.getString(aqi);data.cityobj1.getString(city);wea.datadata;ListForecast forecastsnew ArrayList();// 获取forecast数组JSONArray jArr obj1.getJSONArray(forecast);for (int i 0; i jArr.length(); i) {JSONObject obj2 jArr.getJSONObject(i);Forecast forecastnew Forecast();forecast.dateobj2.getString(date);forecast.fengxiangobj2.getString(fengxiang);forecast.highobj2.getString(high);forecast.lowobj2.getString(low);forecast.fengliobj2.getString(fengli);forecast.typeobj2.getString(type);forecasts.add(forecast);}data.forecastforecasts;JSONObject obj3 obj1.getJSONObject(yesterday);Yesterday yesterdaynew Yesterday();yesterday.flobj3.getString(fl);yesterday.fxobj3.getString(fx);yesterday.highobj3.getString(high);yesterday.typeobj3.getString(type);yesterday.lowobj3.getString(low);yesterday.dateobj3.getString(date);data.yesterdayyesterday;// 输出字段System.out.println(wea);}}

相关新闻

数学学习指南

数学学习指南

基础数学学习地图 北京大学数学与应用数学双学位的学分要求 参考文献 Mathematics | MIT OpenCourseWare | Free Online Course Materials我想业余时间系统学习数学,想求一份学习地图,请问我应该该怎么学习呢?学习哪些 和教程呢?…

2026/7/10 12:59:26 阅读更多 →
前馈控制与反馈控制对比

前馈控制与反馈控制对比

自动控制系统中主要包含两大类控制,一种是前馈控制,另一种是反馈控制。那么二者之间究竟有怎么的区别和联系。本文做简要介绍。 1. 前馈控制属于开环控制,反馈控制属于负反馈的闭环控制 在自动控制系统中,反馈控制是闭环控制&am…

2026/7/10 12:59:26 阅读更多 →
RimSort终极教程:3步彻底解决环世界模组冲突问题

RimSort终极教程:3步彻底解决环世界模组冲突问题

RimSort终极教程:3步彻底解决环世界模组冲突问题 【免费下载链接】RimSort RimSort is an open source mod manager for the video game RimWorld. There is support for Linux, Mac, and Windows, built from the ground up to be a reliable, community-managed a…

2026/7/10 12:54:56 阅读更多 →

最新新闻

(8-2)Bellman-Ford算法的局限性与改进

(8-2)Bellman-Ford算法的局限性与改进

Bellman-Ford算法的局限性与改进

2026/7/10 13:45:25 阅读更多 →
Obsidian表格插件终极指南:5个技巧实现笔记数据管理革命

Obsidian表格插件终极指南:5个技巧实现笔记数据管理革命

Obsidian表格插件终极指南:5个技巧实现笔记数据管理革命 【免费下载链接】obsidian-excel 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian-excel 在知识管理领域,Obsidian表格插件正在彻底改变我们处理结构化数据的方式。这款强大的工具…

2026/7/10 13:43:24 阅读更多 →
Android Studio中文语言包终极指南:3分钟打造全中文开发环境

Android Studio中文语言包终极指南:3分钟打造全中文开发环境

Android Studio中文语言包终极指南:3分钟打造全中文开发环境 【免费下载链接】AndroidStudioChineseLanguagePack AndroidStudio中文插件(官方修改版本) 项目地址: https://gitcode.com/gh_mirrors/an/AndroidStudioChineseLanguagePack 你是否曾…

2026/7/10 13:41:20 阅读更多 →
SDXL概念流形技术:低计算成本实现生成图像精准操控

SDXL概念流形技术:低计算成本实现生成图像精准操控

这次我们来看一个关于SDXL模型的重要发现:概念流形(Concept Manifold)的识别与应用。这个发现的核心价值在于,它让我们能够用极低的计算成本实现对生成结果的精准操控,为SDXL模型的实用化打开了新的可能性。如果你正在…

2026/7/10 13:37:16 阅读更多 →
如何完全掌控微信聊天记录:3个简单步骤实现永久保存的终极指南

如何完全掌控微信聊天记录:3个简单步骤实现永久保存的终极指南

如何完全掌控微信聊天记录:3个简单步骤实现永久保存的终极指南 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/…

2026/7/10 13:33:05 阅读更多 →
如何快速掌握LaTeX科学图表绘制:面向研究者的154个专业图表资源库

如何快速掌握LaTeX科学图表绘制:面向研究者的154个专业图表资源库

如何快速掌握LaTeX科学图表绘制:面向研究者的154个专业图表资源库 【免费下载链接】tikz Diagrams of concepts in physics/chemistry/ML 项目地址: https://gitcode.com/gh_mirrors/tikz/tikz 你是否曾经为学术论文或技术文档中的图表绘制而烦恼&#xff1f…

2026/7/10 13:33:05 阅读更多 →

日新闻

STM32与LTC1864高精度ADC的SPI通信实现

STM32与LTC1864高精度ADC的SPI通信实现

1. 项目背景与核心需求在工业控制和嵌入式系统开发中,模拟信号与数字系统的无缝集成一直是工程师面临的关键挑战。LTC1864作为一款16位高精度ADC转换器,配合STM32F101ZG这类主流微控制器,能够构建高性能的模拟信号采集系统。这种组合特别适合…

2026/7/10 0:03:07 阅读更多 →
猫抓插件:浏览器资源嗅探与视频下载的终极解决方案

猫抓插件:浏览器资源嗅探与视频下载的终极解决方案

猫抓插件:浏览器资源嗅探与视频下载的终极解决方案 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 还在为网页视频无法下载而烦恼吗&am…

2026/7/10 0:05:09 阅读更多 →
直流有刷电机驱动方案:TC78H653FTG与MKV46F256VLH16应用

直流有刷电机驱动方案:TC78H653FTG与MKV46F256VLH16应用

1. 直流有刷电机驱动方案概述在工业自动化和消费电子领域,直流有刷电机因其结构简单、控制方便、成本低廉等优势,仍然是许多应用场景的首选驱动方案。TC78H653FTG作为东芝推出的新一代H桥驱动器,与MKV46F256VLH16微控制器配合使用&#xff0c…

2026/7/10 0:05:09 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/8 16:14:06 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/9 13:46:46 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/9 21:41:05 阅读更多 →

月新闻