JSON的三种解析方式以及JSONObject、JSONArray区别
JSON的常用两种解析方式
一、什么是JSON?
JSON是一种取代XML的数据结构,和xml相比,它更小巧但描述能力却不差,由于它的小巧所以网络传输数据将减少更多流量从而加快速度。
JSON就是一串字符串 只不过元素会使用特定的符号标注。
{} 双括号表示对象
[] 中括号表示数组
"" 双引号内是属性或值
: 冒号表示后者是前者的值(这个值可以是字符串、数字、也可以是另一个数组或对象)
所以 {"name": "Michael"} 可以理解为是一个包含name为Michael的对象
而[{"name": "Michael"},{"name": "Jerry"}]就表示包含两个对象的数组
当然了,你也可以使用{"name":["Michael","Jerry"]}来简化上面一部,这是一个拥有一个name数组的对象
二、JSON解析之传统的JSON解析
1、生成json字符串
public static String createJsonString(String key, Object value) {JSONObject jsonObject = new JSONObject();jsonObject.put(key, value);return jsonObject.toString(); }
2、解析JSON字符串
分为以下三种情况,一个JavaBean,一个List数组,一个嵌套Map的List数组:
import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map;import org.json.JSONArray; import org.json.JSONObject;import com.android.myjson.domain.Person;/*** 完成对json数据的解析* */ public class JsonTools {public static Person getPerson(String key, String jsonString) {Person person = new Person();try {JSONObject jsonObject = new JSONObject(jsonString);JSONObject personObject = jsonObject.getJSONObject("person");person.setId(personObject.getInt("id"));person.setName(personObject.getString("name"));person.setAddress(personObject.getString("address"));} catch (Exception e) {// TODO: handle exception }return person;}public static List getPersons(String key, String jsonString) {List list = new ArrayList();try {JSONObject jsonObject = new JSONObject(jsonString);// 返回json的数组JSONArray jsonArray = jsonObject.getJSONArray(key);for (int i = 0; i < jsonArray.length(); i++) {JSONObject jsonObject2 = jsonArray.getJSONObject(i);Person person = new Person();person.setId(jsonObject2.getInt("id"));person.setName(jsonObject2.getString("name"));person.setAddress(jsonObject2.getString("address"));list.add(person);}} catch (Exception e) {// TODO: handle exception }return list;}public static List getList(String key, String jsonString) {List list = new ArrayList();try {JSONObject jsonObject = new JSONObject(jsonString);JSONArray jsonArray = jsonObject.getJSONArray(key);for (int i = 0; i < jsonArray.length(); i++) {String msg = jsonArray.getString(i);list.add(msg);}} catch (Exception e) {// TODO: handle exception }return list;}public static List> listKeyMaps(String key,String jsonString) {List> list = new ArrayList>();try {JSONObject jsonObject = new JSONObject(jsonString);JSONArray jsonArray = jsonObject.getJSONArray(key);for (int i = 0; i < jsonArray.length(); i++) {JSONObject jsonObject2 = jsonArray.getJSONObject(i);Map map = new HashMap();Iterator iterator = jsonObject2.keys();while (iterator.hasNext()) {String json_key = iterator.next();Object json_value = jsonObject2.get(json_key);if (json_value == null) {json_value = "";}map.put(json_key, json_value);}list.add(map);}} catch (Exception e) {// TODO: handle exception }return list;} }
三、JSON解析之FastJSON
import java.util.ArrayList; import java.util.List; import java.util.Map;import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.TypeReference;public class JsonTool {public static T getPerson(String jsonstring, Class cls) {T t = null;try {t = JSON.parseObject(jsonstring, cls);} catch (Exception e) {// TODO: handle exception }return t;}public static List getPersonList(String jsonstring, Class cls) {List list = new ArrayList();try {list = JSON.parseArray(jsonstring, cls);} catch (Exception e) {// TODO: handle exception }return list;}public static List> getPersonListMap1(String jsonstring) {List> list = new ArrayList>();try {list = JSON.parseObject(jsonstring,new TypeReference>>() {}.getType());} catch (Exception e) {// TODO: handle exception }return list;} }
总结:
JSON对于移动设备来说,尤其对于网络环境较差和流量限制的情况下,相对于XML格式的数据传输会更节省流量,传输效率更高。在这三种解析方式中FastJson是效率最高的,推荐使用。
JSONObject、JSONArray区别
json,就是一个键对应一个值,超级简单的一对一关系。现在用到的json那可以层层嵌套啊,刚开始接触的时候,确实有种崩溃的赶脚,不想去理,取个数据还那么麻烦。其实,就跟if else语句一样,如果if中套if,if中再套if,写的规范了还行,要是代码格式不规范,那我们肯定也看着麻烦。所以啊,对于json嵌套,只要记住符号“:”前是键,符号后是值大括号成对找,一层层剥开,就清楚了。 举个例子说明,如下:
[{name1:{name2:{name3:'value1',name4:'value2'}}},{}]
从外到里看,例子中就是一个数组,数组里面是两个json格式的字符串。这样分析思路就清晰多了。
工作中需要取出name4的值,你们会怎么取呢?。最初我都想过字符串截取,那时还不了解JSONArray,现在知道了,取出来也就相当容易了。
取出name4值过程步骤:1,将以上字符串转换为JSONArray对象;2,取出对象的第一项,JSONObject对象;3,取出name1的值JSONObject对象;4,取出name2的值JSONObject对象;5,取出name4的值value2。
示例中json数组格式的字符串可以通过方法直接转换为JSONArray的格式:
JSONArray.fromObject(String)
- JSONArray getJsonArray=JSONArray.fromObject(arrayStr);//将结果转换成JSONArray对象的形式
- JSONObject getJsonObj = getJsonArray.getJSONObject(0);//获取json数组中的第一项
- String result=getJsonObj.getJSONObject("name1").getJSONObject("name2").getJSONObject("name4");
好了我们说说这两个对象。
1,JSONObject
json对象,就是一个键对应一个值,使用的是大括号{ },如:{key:value}
2,JSONArray
json数组,使用中括号[ ],只不过数组里面的项也是json键值对格式的
Json对象中添加的是键值对,JSONArray中添加的是Json对象
- JSONObject Json = new JSONObject();
- JSONArray JsonArray = new JSONArray();
- Json.put("key", "value");//JSONObject对象中添加键值对
- JsonArray.add(Json);//将JSONObject对象添加到Json数组中
3,JSONObject与Map
Map map和json都是键值对,不同的是map中键值对中间用等号分开,json中键值对中间用冒号分开。其实json就是一种特殊形式的map。
- Map<String,String> strmap=new JSONObject();
这里的需求是:request对象获取的map,想要返回json格式也不用白费力了。
JSON的三种解析方式以及JSONObject、JSONArray区别相关推荐
- JSON的两种解析方式
JSON的两种解析方式:Gson和Fastjson,下面来看下这两种解析方法怎样使用,并且他们有哪些区别. 1.Gson: Gson是谷歌的一款JSON解析工具. 功能①:将对象转化为JSON字符串 ...
- xml的三种解析方式
本篇博客重点介绍Android中三种解析XML的方式,包括PULL.SAX.DOM,当然不止这些,还可以用第三方的jar包提供的解析,只是这三种在Android中比较常用吧.再顺便介绍一下Androi ...
- xml文件的三种解析方式 DOM SAM PULL
<?xml version="1.0" encoding="UTF-8"?> <root><student id="1& ...
- C++的三种继承方式详解
文章目录 @[toc] C++的三种继承方式详解以及区别 前言 一.public继承 二.protected继承 三.private继承 四.三者区别 五.总结 后话 C++的三种继承方式详解以及区别 ...
- js中将字符串转换成json的三种方式
ECMA-262(E3) 中没有将JSON概念写到标准中,还好在 ECMA-262(E5) 中JSON的概念被正式引入了,包括全局的JSON对象和Date的toJSON方法. 1,eval方式解析,恐 ...
- Web框架之Django_07 进阶操作(MTV与MVC、多对多表三种创建方式、前后端传输数据编码格式contentType、ajax、自定义分页器)
阅读目录 一.MVC与MTV 二.多对多表的创建 三.ajax,前后端传输编码格式contentType 四.批量插入数据与自定义分页器 摘要 MTV与MVC 多对多表三种创建方式 ajax ,前后端 ...
- oracle Hash Join及三种连接方式
在Oracle中,确定连接操作类型是执行计划生成的重要方面.各种连接操作类型代表着不同的连接操作算法,不同的连接操作类型也适应于不同的数据量和数据分布情况. 无论是Nest Loop Join(嵌套循 ...
- python中if brthon环境安装包_Ant、Gradle、Python三种打包方式的介绍
今天谈一下Androdi三种打包方式,Ant.Gradle.Python. 当然最开始打包用Ant 很方便,后来转Studio开发,自带很多Gradle插件就用了它,然后随着打包数量越多,打包时间成了 ...
- 006 CSS三种引入方式
CSS三种引入方式 一.三种方式的书写规范 1.行间式 <div style="width: 100px; height: 100px; background-color: red&q ...
最新文章
- 【[AHOI2013]差异】
- 云宇宙iwemeta: 亚马逊全面进军元宇宙
- 翻译SSD论文(Single Shot MultiBox Detector)
- 高斯、柯西、拉格朗日都还在的话,他们应该最喜欢这个公众号
- 数据挖掘在呼叫中心的六大应用点
- C 多线程的互斥锁应用RAII机制
- mysql schema 保存数据_如何在mysql数据库中保存apache spark schema输出
- 设置UYVY格式YUV为黑色
- json for-in 来循环对象的属性
- android adb工具命令大全
- 国际计算机网络信息与安全管理,计算机信息网络国际联网单位安全管理制度
- excel文件保护忘记密码解除
- 20155317 2016-2017-2 蓝墨云班课考题第2周
- Navicat 15注册时报错“Rsa Public key not find“的解决办法
- python语言编写爬虫_自写Python小爬虫一个 - 『编程语言区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn...
- Shopee本土店如何做,各国家站点市场分析及热销产品
- C# 设计原则 之 迪米特 原则
- 电影评分数据集的分析
- 研发效能工程实践-代码评审
- 骗子QQ 14258588665 买ig骗我2600