版权声明:未经博主允许不得转载

一:简介

【达叔有道】软件技术人员,时代作者,从 Android 到全栈之路,我相信你也可以!阅读他的文章,会上瘾!You and me, we are family !

二:前言

在开发中我们要面对很复杂的操作,那么今天的网络请求与数据解析也是对于学习Android开发者来说,需要解决的难题,我只是讲解一下知识内容,用于理解这方面的知识点。

三:HttpUrlConnection和JSON数据解析

网络请求有两种类型,一个是get,另一个是post。网络请求通常使用HttpUrlConnction,HttpClient,还有更多的框架使用,这些框架也是其他人自己开发出来便于使用的。

对于json解析,官方的原生解析和Gson解析,JSON是一种轻量级的数据交换格式,有很好的可读性和快速编写的特点。建议你可以下载一个Google插件,JSON Viewer可以便于看起来舒服点。

看看JSON数据api: https://www.sojson.com/open/api/weather/json.shtml?city=上海

在你的Android Studio中也提供一个插件名为:GsonFormat,GsonFormat可以帮你格式化Json数据,并自动生成相应的属性类。这个插件是不是很好,那就下载吧,如果项目巨大,你的Json数据多到你也不想打代码了吧!

下载完Android Studio中的插件时(过程可以百度)重新启动一下就行。我们来验证是否安装成功,找个java文件按alt+S,弹出GsonFormat的窗口则代表安装成功。

在GsonFormat中,放入https://www.sojson.com/open/api/weather/json.shtml?city=%E4%B8%8A%E6%B5%B7(复制全部放入),点击Format即可。

有了GsonFormat的功能,我们就不用辛苦生成Json数据里的属性类。

四:使用json解析

JSON数据一般由服务器端提供接口,我们根据接口地址解析数据,然后把数据显示在APP上。

举例:接口地址

多个数据
{
'students':[
{'id':'1',
'name':'peipei',
'sex':'男'},
{'id':'2',
'name':'kebin',
'sex':'男'},
{'id':'3',
'name':'hong',
'sex':'女'},
]
}
private void parseJson(String strResult){
try{
JSONArray obj = new JSONObject(strResult).getJSONArray("students");
String s="";
for(int i=0;i<obj.length();i++){
JSONObject json = (JSONObject)obj.get(i);
int id = json.getInt("id");
String name=json.getString("name");
String sex=json.getString("sex");
s+="Id号:"+id+",名字:"+name+",性别:"+sex+"\n";
} }catch(JSONException e){
e.printStackTrace();
}

如果这样写我的天,也是挺累,对于使用Gson来说就很方便啦。待会我来讲使用方法。

对于Android来说重要的网络部分,如何解决从网络上下载数据,如何解决上传,等。我们开发app会不断向服务器发送请求,那么返回到APP的是json数据的字符串,我们需要对json数据进行解析才能显示到app客户端上。对于HTTP协议是这样的,http为超文本传送协议,是web的基础,http是建立在tcp上的一种。http在客户端发送请求都要服务器回送响应,请求结束后,会主动释放。这个过程连接到关闭为一次连接。

五:网络权限

在我们使用网络请求的时候,需要的是设置权限,这一点千万别忘记了。

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

六:使用Gson

Gson就是一个jar包,导入就行,源代码可以看看:https://github.com/google/gson

我们只要在build.gradle的dependencies下

放入代码:

implementation 'com.google.code.gson:gson:2.2.4'
//我的是导入的

我们来使用这个接口试试:https://www.sojson.com/open/api/weather/json.shtml?city=广州

使用Gson,解析

public static WeatherBean getWeather(String res) {
//创建Gson对象
Gson gson =new Gson();
//gson.fromJson(参数1,参数2);
WeatherBean wetherBean = gson.fromJson(res, WeatherBean.class);
//返回
return wetherBean;
}

七:比较详细地说明

//HttpUrlConnection
//1.实例化一个URL的对象
//2.获取HttpUrlConnection对象
//3.设置请求连接的属性
//4.获取响应码,判断是否连接成功
//5.读取输入流并解析

八:

要创建一个子线程

new Thread(){
@Override
public void run(){
try{
URL url = new URL(“api地址”);
HttpURLConnection coon=(HttpURLConnection)url.openConnection();
coon.setRequestMethod(“GET”);
coon.setReadTimeout(6000);
//获取响应码
If(coon.getResponseCode()==200){
InputStream in=coon.getInputStream();
byte[] b = new byte[1024*512];
int len=0;
//建立缓存流,保存所读取的字节数组
ByteArrayOutputStream baos = new ByteArrayOutputStream(); while((len=in.read(b))>-1){
baos.write(b,0,len);
}
String msg = baos.toString();
Log.e(“TAG”,msg); //JSON数据的解析:1.原生解析2.gson解析
JSONObject obj = new JSONObject(msg);//捕获异常 int dui = obj.getInt("dui");
String msg2 = obj.getString("msg"); Log.e("TAG,"+dui+" "+msg2); JSONObject data = obj.getJSONObject("data");
String title = data.getString("title");
String author = data.getString("author");
String content = data.getString("content");
Log.e("TAG","标题:"+title+",作者"+author+",内容:"+content); //显示 解决问题-将操作权交还给主线程 Message message = handler.obtainMessage();
Weather e = new Weather (title,author,content);
message.obj = e; //调用此方法,会触发主线程中Handler对象里覆盖了的handleMessage方法 handler.sendMessage(message);
//nameView.setText(title);
//authorView.setText(author);
//contentView.setText(content); }
}catch(MalformedURLException e){
e.printStackTrace();
}catch(IOExeption e){
e.printStackTrace();
}catch(JSONException e){
e.printStackTrace();
}
}
}.start();
//Hander hander = new Hander()
这个用来解决主线程和子线程进行交互的问题
//封装对象
private Hander handler = new Handler(){
@Override
public void handleMessage(Message msg){
super.handleMessage(msg); //获取
Weather e = (Weather)msg.obj;
nameView.setText(e.getTitle());
authorView.setText(e.getAuthor());
contentView.setText(e.getContent()); }
};
//使用Gson解析上一步
//1.创建Gson对象
Gson gson = new Gson();
//参数1:满足json对象格式的字符串
String data=obj.getString("data");
Weather e = gson.fromJson(data,Weather.class);
//JSONObject jo= new JSONObject(result);
//JSONArray ary = jo.getJSONArray("data"); //for(int i=0;i<ary.length();i++){
//JSONObject obj = ary.getJSONObject(i):
//String a = obj.getString("name");
//} private void parseJson(String strResult){
try{
JSONArray obj = new JSONObject(strResult).getJSONArray("students");
String s="";
for(int i=0;i<obj.length();i++){
JSONObject json = (JSONObject)obj.get(i);
int id = json.getInt("id");
String name=json.getString("name");
String sex=json.getString("sex");
s+="Id号:"+id+",名字:"+name+",性别:"+sex+"\n";
} }catch(JSONException e){
e.printStackTrace();
}
//比较
String data=new JSONObject(result).getString("data");
//使用Gson
Gson gson = new Gson();
//使用Gson,快速解析,添加jar包
//1.解析普通的json对象
//2.解析json数组
//参数1:满足json数组形式的字符串
//参数2:Type对象,泛型将会决定,你的json字符串最后被转化成的类型
ArrayList<对象> objects = gson.fromJson(data,new TypeToken<ArrayList<对象>>(){}.getType());

以上就是个人记录知识点

编辑 :达叔

定位:分享 Android&Java 知识点

Android网络请求与数据解析,使用Gson和GsonFormat解析复杂Json数据的更多相关文章

  1. Android网络请求框架AsyncHttpClient实例详解(配合JSON解析调用接口)

    最近做项目要求使用到网络,想来想去选择了AsyncHttpClient框架开进行APP开发.在这里把我工作期间遇到的问题以及对AsyncHttpClient的使用经验做出相应总结,希望能对您的学习有所 ...

  2. Android网络请求通信之Volley

    一.Volley简介 Volley网络框架是Google公司在2013年发布的一款Android平台上的网络请求通信库.以下是对Volley的简单归纳. Volley的优点: 使网络通信更快.更简单. ...

  3. Android 网络请求框架Retrofit

    Retrofit是Square公司开发的一款针对Android网络请求的框架,Retrofit2底层基于OkHttp实现的,OkHttp现在已经得到Google官方认可,大量的app都采用OkHttp ...

  4. Android 网络请求Retrofit + RxJava

    一.背景 经常看到项目用Retrofit+RxJava+RxAndroid的框架,为了看懂项目的结构.现在来了解一下,Retrofit: Retrofit是Square 公司开发的一款正对Androi ...

  5. xamarin android网络请求总结

    xamarin android中网络请求的框架非常多,在项目中使用的是第三方的一个网络请求框架restsharp,应该是github上.net网络请求最多star的框架,没有之一.这里就简单汇总了其他 ...

  6. Android 网络请求及数据处理

    Android 网络请求: 1.Volley   http://blog.csdn.net/t12x3456/article/details/9221611 2.Android-Async-Http  ...

  7. Android网络请求与解析

    1.Volley和Gson结合使用——Volley适用于小型数据,多次的请求,使用Gson解析时,服务器数据的键值不能包含常用的标识符如:class.....等,这些就需要与服务端小伙伴商量 这样也可 ...

  8. android 网络请求Ⅰ

    本章讲述在android开发中,常用的网络请求操作.网络请求利用android基本的HttpURLConnection连接URL和开源网络请求包AsyncHttpClient.本次网络请求以调取天气接 ...

  9. Android网络请求心路历程

    HTTP请求&响应 既然说从入门级开始就说说Http请求包的结构.一次请求就是向目标服务器发送一串文本.什么样的文本?有下面结构的文本.HTTP请求包结构 例子: 1 2 3 4 5 6 7 ...

随机推荐

  1. Mac 笔记本 开发日记

    1.录屏,截图 Mac 自带录屏功能 command +control +o 2.复制当前应用,在启一个当前app窗口 command+n 3.快速回到桌面 command +f3 4.选中文件,复制 ...

  2. 如何学习DeepLearning

    多年来,科学家们为了搞清楚神经网络的运行机制,进行了无数次实验.但关于神经网络的内在运行方式,目前还没有系统性的理论,没有具体的路线可以指引你获得更好的性能.简单地下载开源工具包直接使用并不能跑出很棒 ...

  3. JAVA程序调试

    调试 步骤1:设置断点(不能在空白处设置断点) 步骤2:启动调试 步骤3:调试代码(F6单步跳过)笔记本Fn+F6(F5) 步骤4:结束调试 掌握调试的好处? l  很清晰的看到,代码执行的顺序 l  ...

  4. uboot1.1.6

    http://blog.csdn.net/lizuobin2/article/details/52061530

  5. C++重写(覆盖)、重载、重定义、

    总结: 重写(覆盖)override 是指派生类函数重写(覆盖)基类函数 不同的范围,分别位于基类和派生类中 函数的名字相同 参数相同 基类函数必须有virtual关键字 重载overload 成员函 ...

  6. 89. Gray Code返回位运算的所有生成值

    [抄题]: The gray code is a binary numeral system where two successive values differ in only one bit. G ...

  7. Working days

    form FRM_GET_WORKING_DAYS TABLES pt_days CHANGING pv_duration. DATA:ls_xt001w TYPE t001w, lv_sdate T ...

  8. github windows配置以及ssh生成 Permission denied (publickey)

    1:进入cmd命令下,或者可以使用GIt工具   (如果出现了 Permission denied 或者配置多个SSH Key跳第6步) git工具  下载地址:https://git-scm.com ...

  9. 腾讯云的基本配置(centos 7.1)及mysql的使用

    因为想在微信上开发些东西,所以租用了一个月的腾讯云. 推荐选择的镜像是centos7.1.这个系统的选择和本地操作系统基本没有关系. 首先要登录到云主机中,用户名是root,密码是当初自己设置的那一个 ...

  10. Postgresql之VACUUM和VACUUM FULL对比

    VACUUM命令存在两种形式,VACUUM和VACUUM FULL,它们之间的区别见如下表格: 无VACUUM VACUUM VACUUM FULL 删除大量数据之后 只是将删除数据的状态置为已删除, ...