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)

  1. JSONArray getJsonArray=JSONArray.fromObject(arrayStr);//将结果转换成JSONArray对象的形式
  2. JSONObject getJsonObj = getJsonArray.getJSONObject(0);//获取json数组中的第一项
  3. String result=getJsonObj.getJSONObject("name1").getJSONObject("name2").getJSONObject("name4");

好了我们说说这两个对象。

1,JSONObject

json对象,就是一个键对应一个值,使用的是大括号{ },如:{key:value}

2,JSONArray

json数组,使用中括号[ ],只不过数组里面的项也是json键值对格式的

Json对象中添加的是键值对,JSONArray中添加的是Json对象

  1. JSONObject Json = new JSONObject();
  2. JSONArray JsonArray = new JSONArray();
  3. Json.put("key", "value");//JSONObject对象中添加键值对
  4. JsonArray.add(Json);//将JSONObject对象添加到Json数组中

3,JSONObject与Map

Map map和json都是键值对,不同的是map中键值对中间用等号分开,json中键值对中间用冒号分开。其实json就是一种特殊形式的map。

  1. Map<String,String> strmap=new JSONObject();

这里的需求是:request对象获取的map,想要返回json格式也不用白费力了。

JSON的三种解析方式以及JSONObject、JSONArray区别相关推荐

  1. JSON的两种解析方式

    JSON的两种解析方式:Gson和Fastjson,下面来看下这两种解析方法怎样使用,并且他们有哪些区别. 1.Gson: Gson是谷歌的一款JSON解析工具. 功能①:将对象转化为JSON字符串 ...

  2. xml的三种解析方式

    本篇博客重点介绍Android中三种解析XML的方式,包括PULL.SAX.DOM,当然不止这些,还可以用第三方的jar包提供的解析,只是这三种在Android中比较常用吧.再顺便介绍一下Androi ...

  3. xml文件的三种解析方式 DOM SAM PULL

    <?xml version="1.0" encoding="UTF-8"?> <root><student id="1& ...

  4. C++的三种继承方式详解

    文章目录 @[toc] C++的三种继承方式详解以及区别 前言 一.public继承 二.protected继承 三.private继承 四.三者区别 五.总结 后话 C++的三种继承方式详解以及区别 ...

  5. js中将字符串转换成json的三种方式

    ECMA-262(E3) 中没有将JSON概念写到标准中,还好在 ECMA-262(E5) 中JSON的概念被正式引入了,包括全局的JSON对象和Date的toJSON方法. 1,eval方式解析,恐 ...

  6. Web框架之Django_07 进阶操作(MTV与MVC、多对多表三种创建方式、前后端传输数据编码格式contentType、ajax、自定义分页器)

    阅读目录 一.MVC与MTV 二.多对多表的创建 三.ajax,前后端传输编码格式contentType 四.批量插入数据与自定义分页器 摘要 MTV与MVC 多对多表三种创建方式 ajax ,前后端 ...

  7. oracle Hash Join及三种连接方式

    在Oracle中,确定连接操作类型是执行计划生成的重要方面.各种连接操作类型代表着不同的连接操作算法,不同的连接操作类型也适应于不同的数据量和数据分布情况. 无论是Nest Loop Join(嵌套循 ...

  8. python中if brthon环境安装包_Ant、Gradle、Python三种打包方式的介绍

    今天谈一下Androdi三种打包方式,Ant.Gradle.Python. 当然最开始打包用Ant 很方便,后来转Studio开发,自带很多Gradle插件就用了它,然后随着打包数量越多,打包时间成了 ...

  9. 006 CSS三种引入方式

    CSS三种引入方式 一.三种方式的书写规范 1.行间式 <div style="width: 100px; height: 100px; background-color: red&q ...

最新文章

  1. 【[AHOI2013]差异】
  2. 云宇宙iwemeta: 亚马逊全面进军元宇宙
  3. 翻译SSD论文(Single Shot MultiBox Detector)
  4. 高斯、柯西、拉格朗日都还在的话,他们应该最喜欢这个公众号
  5. 数据挖掘在呼叫中心的六大应用点
  6. C 多线程的互斥锁应用RAII机制
  7. mysql schema 保存数据_如何在mysql数据库中保存apache spark schema输出
  8. 设置UYVY格式YUV为黑色
  9. json for-in 来循环对象的属性
  10. android adb工具命令大全
  11. 国际计算机网络信息与安全管理,计算机信息网络国际联网单位安全管理制度
  12. excel文件保护忘记密码解除
  13. 20155317 2016-2017-2 蓝墨云班课考题第2周
  14. Navicat 15注册时报错“Rsa Public key not find“的解决办法
  15. python语言编写爬虫_自写Python小爬虫一个 - 『编程语言区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn...
  16. Shopee本土店如何做,各国家站点市场分析及热销产品
  17. C# 设计原则 之 迪米特 原则
  18. 电影评分数据集的分析
  19. 研发效能工程实践-代码评审
  20. 骗子QQ 14258588665 买ig骗我2600

热门文章

  1. 郭天祥十天入门单片机学习笔记
  2. 云服务器怎么挂网站,云服务器怎么设置挂网页游戏
  3. 公司利润爆棚,为啥还要减少我的年终奖?
  4. Centos中用户相关操作(创建用户、设置密码、切换用户、修改用户信息、附加组、删除用户、用户分类)
  5. 炫到爆炸!HuggingGPT在线演示惊艳亮相
  6. 思维才是真正的力量,知识只是改变思维的原材料而于
  7. 【Apache 网页优化】
  8. 千锋老师追忆Hadoop大数据
  9. 【Linux】execlp通过结构体传参
  10. 域名分级与域名解析过程(DNS)