【Android】8.0网络请求数据与JSON解析

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 既然需要访问网络自然需要网络请求权限<uses-permission android:name="android.permission.INTERNET"/>除此之外还需要加上这一行,否则http的网页请求不成功android:usesCleartextTraffic="true"


注意:不是教程只是笔记,如有错误欢迎批评指正

🍁网络请求权限

既然需要访问网络自然需要网络请求权限

<uses-permissionandroid:name="android.permission.INTERNET"/>

除此之外还需要加上这一行,否则http的网页请求不成功

android:usesCleartextTraffic="true"

网络异常,图片无法展示
|

🌳网络请求

网络在主线程异常

这段代码是网络请求数据,http://121.4.44.56/user这是老师提前发在网上的数据文件,可通过这个网址访问,其中的数据是:

网络异常,图片无法展示
|

   try {

           URLurl=newURL("http://121.4.44.56/user");

           HttpURLConnectionurlConnection= (HttpURLConnection) url.openConnection();

           urlConnection.setRequestMethod("GET");

 

           

           InputStreaminputStream=urlConnection.getInputStream();// 字节流

           Readerreader=newInputStreamReader(inputStream);//字符流

           BufferedReaderbufferedReader=newBufferedReader(reader);// 缓存流

           Stringresult="";

           Stringtemp;

           while ((temp=bufferedReader.readLine()) !=null) {

               result+=temp;

           }

           Log.i("MainActivity", result);

           inputStream.close();

           reader.close();

           bufferedReader.close();

       } catch (Exceptione) {

           e.printStackTrace();

       }

将这段代码放在主线程下执行会出现警告warn

W/System.err: android.os.NetworkOnMainThreadException

网络在主线程异常-》网络请求不能在主线程

生命周期中执行的方法默认是主线程(UI线程)不能执行耗时的操作

耗时操作-》such as:

读取文件(读数据库)、网络请求

子线程网络请求

因此我们需要创建一个子线程来访问网络数据,并且在子线程中将获取到的数据显示在TextView控件上    

Threadthread=newThread(){

@Override

publicvoidrun() {

   //run()方法执行的代码都是在子线程中

   super.run();

 

   //网络请求

   try {

       //请求服务器端

       URLurl=newURL("http://121.4.44.56/user");

       HttpURLConnectionurlConnection= (HttpURLConnection) url.openConnection();

       urlConnection.setRequestMethod("GET");

 

       //获取io输入字节流->字符流->缓存流

       InputStreaminputStream=urlConnection.getInputStream();// 字节流

       Readerreader=newInputStreamReader(inputStream);//字符流

       BufferedReaderbufferedReader=newBufferedReader(reader);// 缓存流

 

       Stringresult="";

       Stringtemp;

       while ((temp=bufferedReader.readLine()) !=null) {

           result+=temp;

       }

       Log.i("MainActivity", result);

       //在子线程中将获取到的数据显示在`TextView`控件上

       textView.setText(result);

       inputStream.close();

       reader.close();

       bufferedReader.close();

       } catch (Exceptione) {

           e.printStackTrace();

       }

 

   }

 

};

thread.start();

运行发现虚拟机上只显示一部分数据,查看日志窗口发现:

网络异常,图片无法展示
|

线程切换

出现警告:在错误的线程中执行

W/System.err: android.view.ViewRootImpl$CalledFromWrongThreadException: Onlytheoriginalthreadthatcreatedaviewhierarchycantouchitsviews.

原因: 对于UI控件的操作不能放在子线程中->需要放到主线程中执行->线程切换

网络异常,图片无法展示
|

不能直接在主线程中设置,因为主线程和子线程是一起运行的,它们在运行时是无法人为预知的

在子线程中通过runOnUiThread(new Runnable()实现线程切换

StringfinalResult=result;

runOnUiThread(newRunnable() {

   @Override

   publicvoidrun() {

   textView.setText(finalResult);

   }

});

网络异常,图片无法展示
|

🌺JSON数据解析

JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

问题:网络请求是耗时的,那么如何一次请求到所有的数据呢?

如图一次请求到年龄,姓名和是否是学生三个数据,但是我们只需要姓名,我们就只需要通过JSON解析字符串,再通过 键名  获取到姓名

基本类型

json数据结构的特点:"key":value

//json结构 "key":value { "age":30,"name":"张三", "isstudent":true }

//如何从json结构中解析出数据

try {

    //json解析字符串

    JSONObjectjsonObject=newJSONObject(finalResult);

    //通过 键 获取到 值

    Stringname=jsonObject.getString("name");

    textView.setText(name);

    } catch (JSONExceptione) {

       e.printStackTrace();

    }

json字符串的数据结构可以是浮点型,整型,长整型,字符串型,布尔型 ,数组类型,josn类型,class类型等等

网络异常,图片无法展示
|

json类型

json数据结构还可以是json类型的,这种情况需要嵌套解析,http://121.4.44.56/object1文件里的内容如下:

{ "age":20,"name":"张三", "isstudent":true,"class":{"grade":"18级","classname":"计算机科学与技术"} }

//json解析字符串

JSONObjectjsonObject=newJSONObject(finalResult);

//首先获取到嵌套的json类型,这也可以看做通过 键 找 值

//class是键名,{"grade":"18级","classname":"计算机科学与技术"}是值

JSONObjectclassObj=jsonObject.getJSONObject("class");

//再通过 键 获取到 值

StringclassName=classObj.getString("classname");

网络异常,图片无法展示
|

数组类型

json数据结构还可以数数组类型,http://121.4.44.56/object2文件里的内容如下:

{ "grade":"18级","classname":"计算机科学与技术","students":["张三","李四","王五"] }

JSONObjectjsonObject=newJSONObject(finalResult);

//通过数组名获取到数组

JSONArrayjsonArray=jsonObject.getJSONArray("students");

//遍历数组,打印日志

for(inti=0;i<jsonArray.length();++i){

    Stringstudent=jsonArray.getString(i);//根据下标获取

    Log.i("Students","student = "+student);

}

网络异常,图片无法展示
|

json数组类型

再复杂一丢丢,json数组类型,http://121.4.44.56/object3文件里的内容如下:

{ "grade":"20级","classname":"计算机科学与技术",

"students":[

{ "id":"001","age":30,"name":"张三", "isstudent":false },

{ "id":"002","age":25,"name":"李四111", "isstudent":true },

{ "id":"003","age":26,"name":"王1111五", "isstudent":true }

]}

//通过数组名获取到数组

JSONArrayjsonArray=jsonObject.getJSONArray("students");

//遍历数组,打印日志

for(inti=0;i<jsonArray.length();++i){

   //根据下标获取每一个json数据

   JSONObjectstudentobj=jsonArray.getJSONObject(i);

   //通键名获取到每一个json数据下的值

   Stringname=studentobj.getString("name");

   Integerage=studentobj.getInt("age");

   //打印日志

   Log.i("MainActivity","name = "+name+" age = "+age);

 }

网络异常,图片无法展示
|

学习要求:会解析json数据结构,会构json造数据结构

例如京东列表:

{"list":[{"name":iphone12,"price":6799},{"name":iphone12plus,"price":7988},{},{}]}

🌷第三方框架 gson

google/gson:一个Java序列化/反序列化库,用于将Java Objects转换为JSON并返回 (github.com)

优点

  1. 直接将字符串解析成对象
  2. 解析成为一个实体类

添加依赖

implementation 'com.google.code.gson:gson:2.9.0'

创建一个实体类

实体类要求字段的名称和类型严格一致

{ "age":30,"name":"张三", "isstudent":true }

网络异常,图片无法展示
|

使用GSON框架解析

普通json数据类型类

Gson gson=new Gson();

Student student=gson.fromJson(finalResult,Student.class);

Log.i("MainActivity", "run: "+student.name);

网络异常,图片无法展示
|

嵌套json类型实体类

如果是json类型嵌套实体类,那么实体类应该做如下修改:

{ "age":20,"name":"张三", "isstudent":true,"class":{"grade":"18级","classname":"计算机科学与技术"} }

json数据类型对应java的类,所以嵌套的json结构,改写成实体类时也是嵌套的类(内部类),除此之外还要声明这个内部类,因为这里键名是class与java的关键字冲突,所以要注解"class",然后换个变量名

网络异常,图片无法展示
|

网络异常,图片无法展示
|

MainActivity的子线程中解析数据并打印

网络异常,图片无法展示
|

json数组实体类

通常使用java集合类中的List可变数组定义json数据结构中的数组

网络异常,图片无法展示
|

网络异常,图片无法展示
|

实体类插件GsonFormatPlus

GSON框架虽然简化了我们解析数据的过程,但是需要书写一个实体类又给我们添加了麻烦,可以通过如下插件一键生成json数据结构的实体类

安装

网络异常,图片无法展示
|

打开

网络异常,图片无法展示
|

设置

网络异常,图片无法展示
|

使用

在左侧粘贴json数据结构的字符串,然后ok即可

相关文章
|
2天前
|
安全 网络安全 数据安全/隐私保护
网络安全与信息安全:从漏洞到加密,保护数据的关键步骤
【10月更文挑战第24天】在数字化时代,网络安全和信息安全是维护个人隐私和企业资产的前线防线。本文将探讨网络安全中的常见漏洞、加密技术的重要性以及如何通过提高安全意识来防范潜在的网络威胁。我们将深入理解网络安全的基本概念,学习如何识别和应对安全威胁,并掌握保护信息不被非法访问的策略。无论你是IT专业人士还是日常互联网用户,这篇文章都将为你提供宝贵的知识和技能,帮助你在网络世界中更安全地航行。
|
5天前
|
存储 安全 网络安全
云计算与网络安全:如何保护您的数据
【10月更文挑战第21天】在这篇文章中,我们将探讨云计算和网络安全的关系。随着云计算的普及,网络安全问题日益突出。我们将介绍云服务的基本概念,以及如何通过网络安全措施来保护您的数据。最后,我们将提供一些代码示例,帮助您更好地理解这些概念。
|
21天前
|
开发工具 Android开发 iOS开发
深入解析安卓与iOS开发环境的优劣
【10月更文挑战第4天】 本文将深入探讨安卓和iOS两大主流移动操作系统的开发环境,从技术架构、开发工具、用户体验等方面进行详细比较。通过分析各自的优势和不足,帮助开发者更好地理解这两个平台的异同,从而为项目选择最合适的开发平台提供参考。
17 3
|
28天前
|
安全 Android开发 iOS开发
深入解析:安卓与iOS的系统架构及其对应用开发的影响
本文旨在探讨安卓与iOS两大主流操作系统的架构差异,并分析这些差异如何影响应用开发的策略和实践。通过对比两者的设计哲学、安全机制、开发环境及性能优化等方面,本文揭示了各自的特点和优势,为开发者在选择平台和制定开发计划时提供参考依据。
37 4
|
29天前
|
SQL 安全 测试技术
网络安全与信息安全:保护数据的艺术
【9月更文挑战第36天】在数字化时代,网络安全和信息安全已成为维护个人隐私和企业资产的基石。本文深入探讨了网络安全漏洞、加密技术以及安全意识的重要性,旨在为读者提供一份知识宝典,帮助他们在网络世界中航行而不触礁。我们将从网络安全的基本概念出发,逐步深入到复杂的加密算法,最后强调培养安全意识的必要性。无论你是IT专业人士还是日常互联网用户,这篇文章都将为你打开一扇了解和实践网络安全的大门。
32 2
|
17天前
|
存储 大数据 数据库
Android经典面试题之Intent传递数据大小为什么限制是1M?
在 Android 中,使用 Intent 传递数据时存在约 1MB 的大小限制,这是由于 Binder 机制的事务缓冲区限制、Intent 的设计初衷以及内存消耗和性能问题所致。推荐使用文件存储、SharedPreferences、数据库存储或 ContentProvider 等方式传递大数据。
19 0
|
23天前
|
安全 网络安全 Android开发
深度解析:利用Universal Links与Android App Links实现无缝网页至应用跳转的安全考量
【10月更文挑战第2天】在移动互联网时代,用户经常需要从网页无缝跳转到移动应用中。这种跳转不仅需要提供流畅的用户体验,还要确保安全性。本文将深入探讨如何利用Universal Links(仅限于iOS)和Android App Links技术实现这一目标,并分析其安全性。
131 0
|
2天前
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
【10月更文挑战第23天】在数字时代,网络安全和信息安全已成为我们生活中不可或缺的一部分。本文将探讨网络安全漏洞、加密技术和安全意识等方面的内容,以帮助读者更好地了解如何保护自己的网络安全。通过分析常见的网络安全漏洞,介绍加密技术的基本原理和应用,以及强调安全意识的重要性,我们将为读者提供一些实用的建议和技巧,以增强他们的网络安全防护能力。
|
5天前
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
【10月更文挑战第20天】在信息技术飞速发展的今天,网络安全和信息安全问题日益突出。本文将围绕网络安全漏洞、加密技术和安全意识等方面进行深入探讨,旨在提高读者对网络安全的认识和重视程度。文章首先介绍了网络安全漏洞的概念、分类和成因,然后详细阐述了加密技术的基本原理和应用,最后强调了提高个人和组织安全意识的重要性。通过本文的学习,读者将能够更好地理解网络安全的重要性,掌握一些实用的防护措施,并在日常生活中提高自己的安全意识。
47 10
|
2天前
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
【10月更文挑战第23天】在数字化时代,网络安全和信息安全已经成为我们生活中不可或缺的一部分。本文将介绍网络安全漏洞、加密技术和安全意识等方面的内容,帮助读者更好地了解网络安全和信息安全的基本知识。通过本文的学习,您将能够更好地保护自己的个人信息和数据安全。