Android:JSON 简介 & 解析方式 讲解(Gson、AS自带org.json、Jackson)


前言

  • 现今最主流的数据交换格式 非 JSON莫属
  • 今天,我将全面介绍 JSON & 解析方式(GsonAS自带org.jsonJackson),希望你们会喜欢

同样 作为主流的数据交换格式 XML,有兴趣的读者请看文章:XML简介 & 解析方式(DOM、SAX、PULL)


目录

示意图


1. 简介

示意图


2. 语法

  • 1个JSON文件里含多个数据,这些数据 以 JSON值 的形式 存在
// JSON实例
{"skill":{"web":[{"name":"html","year":"5"},{"name":"ht","year":"4"}],"database":[{"name":"h","year":"2"}]
`}}
  • 1个JSON值的内容形式可以是:”名称 - 值“对、数组 或 对象,下面将详细说明
示意图


3. 解析方式

  • Android 解析 JSON数据的方式 类似 XML解析,主要分为2大类:

    示意图

  • 下面,我将详细介绍每种方式

3.1 Android Studio自带org.json解析

  • 解析原理:基于文档驱动

类似于XMLDOM解析方式

  • 解析流程:把全部文件读入到内存中 ->> 遍历所有数据 ->> 根据需要检索想要的数据
  • 具体使用
// 创建需解析的JSON数据:student.json
// 将该文件放入到本地assets文件夹里
{
"student":[{"id":1,"name":"小明","sex":"男","age":18,"height":175},{"id":2,"name":"小红","sex":"女","age":19,"height":165},{"id":3,"name":"小强","sex":"男","age":20,"height":185}],
"cat":"it"
}// 具体解析
import android.os.Bundle;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);EntityStudent student = new EntityStudent();try {//从assets获取json文件InputStreamReader isr = new InputStreamReader(this.getClass().getClassLoader().getResourceAsStream("assets/" + "student.json"));//字节流转字符流BufferedReader bfr = new BufferedReader(isr);String line ;StringBuilder stringBuilder = new StringBuilder();while ((line = bfr.readLine())!=null){stringBuilder.append(line);}//将JSON数据转化为字符串JSONObject root = new JSONObject(stringBuilder.toString());//根据键名获取键值信息System.out.println("root:"+root.getString("cat"));JSONArray array = root.getJSONArray("student");for (int i = 0;i < array.length();i++){JSONObject stud = array.getJSONObject(i);System.out.println("------------------");System.out.print("id="+stud.getInt("id")+ ","));System.out.print("name="+stud.getString("name")+ ","));System.out.print("sex="+stud.getString("sex")+ ","));System.out.print("age="+stud.getInt("age")+ ","));System.out.println("height="+stud.getInt("height")+ ","));bfr.close();isr.close();is.close();//依次关闭流}} catch (IOException e) {e.printStackTrace();} catch (JSONException e) {e.printStackTrace();}}
}

3.2 Gson解析

Google的开源库

  • 解析原理:基于事件驱动
  • 解析流程:根据所需取的数据 建立1个对应于JSON数据的JavaBean类,即可通过简单操作解析出所需数据
  • 具体使用

步骤1:创建一个与JSON数据对应的JavaBean类(用作存储需要解析的数据)
Gson解析的关键 = 根据JSON数据 写出一个对应的JavaBean,规则是:

示意图

下面用2个例子说明 如何通过JSON文档创建JavaBean

/** * 简单转换*/ // JSON数据1String json = "{\"id\":1,\"name\":\"小明\",\"sex\":\"男\",\"age\":18,\"height\":175}";// 对应的JavaBean类public class EntityStudent {private int id;private String name;private String sex;private int age;private int height;public void setId(int id){this.id = id;}public void setName(String name){this.name = name;}public void setSex(String sex){this.sex = sex;}public void setAge(int age){this.age = age;}public void setHeight(int height){this.height = height;}public int getId(){return id;}public String getName(){return name;}public String getSex(){return sex;}public int getAge(){return age;}public int getHeight(){return  height;}public void show(){System.out.print("id=" + id + ",");System.out.print("name=" + name+",");System.out.print("sex=" + sex+",");System.out.print("age=" + age+",");System.out.println("height=" + height + ",");}}/** * 复杂转换*/ // JSON数据2(具备嵌套){"translation":["车"],"basic":{"phonetic":"kɑː","explains":["n. 汽车;车厢","n. (Car)人名;(土)贾尔;(法、西)卡尔;(塞)察尔"]},"query":"car","errorCode":0,"web":[{"value":["汽车","车子","小汽车"],"key":"Car"},{"value":["概念车","概念车","概念汽车"],"key":"concept car"},{"value":["碰碰车","碰撞用汽车","碰碰汽车"],"key":"bumper car"}]}// 对应的复杂的JSON数据对应的JavaBean类public class student {public String[] translation;    //["车"]数组public basic basic;             //basic对象里面嵌套着对象,创建一个basic内部类对象public  static class basic{     //建立内部类public String phonetic;public String[] explains;}public String query;public int errorCode;public List<wb> web;            //web是一个对象数组,创建一个web内部类对象public static class wb{         public String[] value;public String key;}public void show(){//输出数组for (int i = 0;i<translation.length;i++){System.out.println(translation[i]);}//输出内部类对象System.out.println(basic.phonetic);//输出内部类数组for (int i = 0;i<basic.explains.length;i++){System.out.println(basic.explains[i]);}System.out.println(query);System.out.println(errorCode);for (int i = 0;i<web.size();i++){for(int j = 0; j<web.get(i).value.length;j++){System.out.println(web.get(i).value[j]);}System.out.println(web.get(i).key);}}}

若觉得转换过于复杂,请直接使用工具:JSON字符串 转 Java实体类

步骤2:导入GSON库
Android Gradle导入依赖

dependencies {compile 'com.google.code.gson:gson:2.3.1'
}

步骤3:使用Gson进行解析

public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 1. 创建Gson对象Gson gson = new Gson();// 2. 创建JavaBean类的对象Student student = new EntityStudent();// 3. 使用Gson解析:将JSON数据转为单个类实体String json = "{\"id\":1,\"name\":\"小明\",\"sex\":\"男\",\"age\":18,\"height\":175}";student = gson.fromJson(json,Student.class);// 解析:JavaBean对象 = gson.fromJson(son,javaBean类类名.class);// 4. 调用student方法展示解析的数据student.show();// 5. 将Java集合转换为jsonString json2 = gson.toJson(List);        System.out.println(json2);}
}

3.3 Jackson解析

  • 解析原理:基于事件驱动
  • 解析过程:
    1. 类似 GSON,先创建1个对应于JSON数据的JavaBean类,再通过简单操作即可解析
    2. 与 Gson解析不同的是:GSON可按需解析,即创建的JavaBean类不一定完全涵盖所要解析的JSON数据,按需创建属性;但Jackson解析对应的JavaBean必须把Json数据里面的所有key都有所对应,即必须把JSON内的数据所有解析出来,无法按需解析

但Jackson的解析速度、效率都 高于 GSON

  • 具体使用

步骤1:建立Json数据对应的javaBean(规则同GSON)

// 创建需解析的JSON数据:student.json
// 将该文件放入到本地assets文件夹里
{"student":[{"id":1,"name":"小明","sex":"男","age":18,"height":175,"date":[2013,8,11]},{"id":2,"name":"小红","sex":"女","age":19,"height":165,"date":[2013,8,23]},{"id":3,"name":"小强","sex":"男","age":20,"height":185,"date":[2013,9,1]}],"grade":"2"
}// JavaBean类
class test {private  List<stu> student = new ArrayList<stu>();private  int grade;public void setStudent(List<stu> student){this.student = student;}public List<stu> getStudent(){return student;}public void setGrade(int grade){this.grade = grade;}public int getGrade(){return grade;}private static class stu {private  int id;private  String name;private  String sex;private  int age;private  int height;private  int[] date;public void setId(int id){this.id = id;}public int getId(){return id;}public void setName(String name){this.name = name;}public String getName(){return  name;}public void setSex(String sex){this.sex = sex;}public String getSex(){return sex;}public void  setAge(int age){this.age = age;}public int getAge(){return age;}public void setHeight(int height){this.height = height;}public int getHeight(){return height;}public void setDate(int[] date){this.date = date;}public int[] getDate(){return date;}}public String tostring(){String str = "";for (int i = 0;i<student.size();i++){str += student.get(i).getId() + " " + student.get(i).getName() + " " + student.get(i).getSex() + " " + student.get(i).getAge() + " " + student.get(i).getHeight() ;for (int j = 0;j<student.get(i).getDate().length;j++) {str += student.get(i).getDate()[j]+ " " ;}str += "\n";}str += "\n"+getGrade();return str;}
}

步骤2:利用Jackson方法进行解析

public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ObjectMapper objectMapper = new ObjectMapper();try {// 1. //从assets获取json文件InputStreamReader isr = new InputStreamReader(this.getClass().getClassLoader().getResourceAsStream("assets/" + "student.json"),"utf-8");BufferedReader bfr = new BufferedReader(isr);String line;StringBuilder stringBuilder = new StringBuilder();while ((line = bfr.readLine())!=null){stringBuilder.append(line);}// 2. 将JSON数据转化为字符串System.out.println(stringBuilder.toString());System.out.println(tes.tostring());} catch (IOException e) {e.printStackTrace();}}}

4. 解析方式对比

示意图


5. 与XML解析对比

  • 对于 同样作为主流的数据交换格式XML来说,二者对比如下:

    示意图

  • 总的来说,相比于 XMLJSON大小更小、解析方法更简单、解析速度更快。所以,JSON一定是你在数据交换格式选型中的首选

6. 总结

  • 本文全面介绍了现今主流的数据传输格式:JSON

Android系统 (190)---Android:JSON 简介 amp; 解析方式 讲解(Gson、AS自带org.json、Jackson)相关推荐

  1. 【android系统】android系统升级流程分析(一)---recovery模式中进行update包升级流程分析

    今天我们直接来看下android中具体的升级过程是如何的. 升级流程概述 升级的流程图: 升级流程分析 第一步:升级包获取 升级获取可以通过远程下载,也可直接拷贝到指定目录即可. 第二步:准备升级 然 ...

  2. Android系统架构-[Android取经之路]

    摘要:本节主要来讲解Android的系统架构 阅读本文大约需要花费10分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Android的平台设计,欢迎关注我,谢谢! 欢 ...

  3. android 服务端技术,移动应用服务器端开发(基于JSP技术)-2017 Android系统构架 Android系统构架.docx...

    Android系统构架 PAGE 1 目 录 TOC \o "1-3" \h \z \u 一.Android系统构架 1 二.Linux内核层 2 三.系统运行库层 3 (一)系统 ...

  4. 【android系统】android系统升级流程分析(二)---update升级包分析

    接下来我们将通过几篇文章来分析update.zip包在具体Android系统升级的过程,来理解Android系统中Recovery模式服务的工作原理.今天让我先来分析下升级包update.zip. 一 ...

  5. android log抓取方法,Android系统之Android抓取各种log的方法

    Android系统之Android抓取各种log的方法 2018年11月25日 | 萬仟网移动技术 | 我要评论 android之android抓取各种log的方法 1.logcat (四类log b ...

  6. android系统tts TextToSpeech源码原理解析及定制tts引擎

    TextToSpeech 即文字转语音服务,是Android系统提供的原生接口服务,原生的tts引擎应用通过检测系统语言,用户可以下载对应语言的资源文件,达到播报指定语音的文字的能力.但是一切都是在g ...

  7. Android 系统(71)---Android系统build.prop文件生成过程

    Android系统build.prop文件生成过程 Android系统build.prop生成过程 这个文件类似于windows的注册表文件,定义了系统初始的一些参数属性,功能的开放等,通过调整或增加 ...

  8. android系统语音合成,android 语音合成报错

    发现了2个问题 第一个貌似是复制离线的资源出错了(已经核对过读写等权限): 12-19 19:54:49.739 32006-32159/com.zhanglf.youxuanz I/NonBlock ...

  9. Android系统(62)-----Android 7.1 新特性之 Shortcuts 介绍

    Android 7.1 新特性之 Shortcuts 介绍 Android 7.1 允许 App 自定义 Shortcuts,类似 iOS 的 3D touch.通过在桌面长按 App 弹出 Shor ...

最新文章

  1. MongoDB数据库(二:高级操作)
  2. SAP Forecasting and Replenishment for Retail – A short Overview【中英文双语版】
  3. ajax中 get 和 post 的区别
  4. 大龄程序员失业后,看他们是如何破局突围的? | 技术头条
  5. 虎记:强大的nth-child(n)伪类选择器玩法
  6. CSDN账号被冻结了怎么办
  7. php李炎辉,李炎恢PHP视频教程第一季资源分享
  8. 微信小程序 实时音视频通话
  9. 向量微积分——理解梯度
  10. 程序设计基础-SDUT-实验3-while循环
  11. netty编解码之jboss marshalling
  12. 实现两个变量的互换(不借助第三个变量)
  13. WCF学习之:利用Throttling提高服务器性能
  14. linux查看文件内容行数,Linux 中如何查看文件的行数,字数,字节数
  15. 如何将RAW格式的磁盘修改为NTFS?教给你三种操作方法
  16. 百度地图之 添加遮罩层 去除百度地图logo
  17. udt的java实现
  18. 262. Trips and Users
  19. Unity Shader - 水体交互
  20. 不积跬步,无以至千里; 不积小流,无以成江海

热门文章

  1. nginx 获取body参数_日志分析系列(外传二):Nginx日志统一化
  2. 基于tcpdump实例讲解TCP/IP协议
  3. 进程的调度策略与进程的状态
  4. ir指令、立即数的作用_我们一起学RISC-V——08-RV32I 指令应用实战
  5. c语言程序可以单独编译,c语言的函数能单独进行编译吗?
  6. oracle空格分割字符串,Oracle字符串分割的处理
  7. Syslog4j介绍
  8. 知易游戏开发教程cocos2d-x移植版001
  9. LeetCode 116. 填充每个节点的下一个右侧节点指针
  10. HDU 5157(回文树)