Okhttp响应Json数据

简介

        OkHttp是一个高效、现代的HTTP客户端库,专为Android和Java应用程序设计,用于发送网络请求和处理响应。它支持HTTP/2和SPDY协议,允许连接复用,减少延迟,提高网络效率。OkHttp还处理了常见的网络问题,如重定向、重试以及超时,为开发者提供了一个简单且强大的接口来进行网络通信。

        JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。JSON格式被广泛用于Web服务之间的数据交换,尤其是在RESTful API中。

当使用OkHttp与远程服务器进行交互,且服务器返回的数据格式为JSON时,开发者通常需要将这些JSON数据转换为Java对象以便于进一步处理。这一过程涉及两个关键步骤:

  1. 请求JSON数据:使用OkHttp发送HTTP请求(如GET或POST)到指定的URL,获取服务器响应的JSON字符串。OkHttp通过构建请求、执行请求并读取响应体中的数据来完成这一过程。

  2. 解析JSON数据:获取到JSON字符串后,需要将其转换为Java对象。常用的做法是借助库如Gson或Jackson。这些库提供了将JSON字符串转换为Java对象(称为序列化)和将Java对象转换回JSON字符串(称为反序列化)的功能。例如,Gson通过调用Gson.fromJson(jsonString, ClassName.class)方法即可将JSON字符串解析为指定类的对象。

结合这两个步骤,开发者能够轻松地使用OkHttp发送网络请求获取JSON数据,并利用Gson等工具解析这些数据,实现与服务器的高效数据交换,支撑各种应用功能,如用户登录认证、数据列表加载、内容搜索等。

一、添加依赖

目标依赖:

com.squareup.okhttp3:okhttp:4.9.0
com.squareup.retrofit2:converter-gson:2.9.0
com.google.code.gson:gson:2.8.8

添加Library:

输入域名(com.squareup.okhttp3):

添加完成:

二、网络访问

目标地址:

t.weather.itboy.net/api/weather/city/101260101

允许网络访问:

<uses-permission android:name="android.permission.INTERNET"/>
 android:networkSecurityConfig="@xml/network"

网络安全配置文件:

        在你的Android项目的res/xml目录下,创建一个名为network_security_config.xml的文件(如果该目录不存在,请先创建它),并添加如下配置以允许特定域名的明文流量(t.weather.itboy.net)(这不推荐用于生产环境,仅作示例)针对http,https不用

<?xml version="1.0" encoding="utf-8"?>
<network-security-config><domain-config cleartextTrafficPermitted="true"><domain includeSubdomains="true">t.weather.itboy.net</domain></domain-config>
</network-security-config>

三、构建实例

1.定义请求URL:

String url = "http://t.weather.itboy.net/api/weather/city/101260101";

2.创建OkHttpClient实例:

OkHttpClient client = new OkHttpClient();

3.构建Request对象:

Request request = new Request.Builder().url(url).build();

四、网络请求

 1.发起异步网络请求(enqueue):

client.newCall(request).enqueue(new Callback() { ... });

2.处理响应结果:

        onFailure

                如果请求失败,会调用此方法,打印错误信息到日志。

@Override
public void onFailure(@NonNull Call call, @NonNull IOException e) {Log.d("22",e.getMessage());
}
  onResponse:

                当请求成功并收到响应时,会调用此方法,。

@Override
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {...
}

五、响应处理

目标数据:

ReSon 方法:

  • try-with-resources: 使用try (ResponseBody responseBody = response.body())自动管理ResponseBody的关闭,确保资源被正确释放。
  • 检查响应状态response.isSuccessful()确认HTTP响应状态码表示成功(通常指200-299范围内的状态码)。
  • 读取响应体responseBody.string()将响应体内容转换为字符串,这是读取网络响应中数据的标准方式。
  • UI更新: 通过runOnUiThread(Runnable)确保在主线程中执行UI更新操作,避免Android的主线程操作限制。这里调用GsonJson(json)方法进一步处理JSON数据。
  • 异常处理: 使用catch (IOException e)捕获并记录在读取响应体时可能出现的任何I/O异常。
 private void ReSon(Response response) {try (ResponseBody responseBody = response.body()) {// 检查响应是否成功(HTTP状态码为200-299)if (!response.isSuccessful() || responseBody == null) {Log.e("22", "错误" + response);return; // 响应不成功或无响应体时,记录错误并退出方法}// 将响应体转换为字符串final String json = responseBody.string();// 在UI线程更新界面runOnUiThread(new Runnable() {@Overridepublic void run() {// 调用GsonJson方法解析JSON数据GsonJson(json);}});} catch (IOException e) {// 捕获并记录读取响应体时可能发生的IO异常Log.e("22", "错误", e);}
}

GsonJson 方法:

  • 创建Gson对象: Gson gson = new Gson(); 这一行创建了Gson的实例,Gson是一个流行的Java库,用于将Java对象转换为JSON字符串,或者反过来将JSON字符串转换为等效的Java对象。

  • 解析JSON: MyJson myJson = gson.fromJson(json, MyJson.class); 这行代码是Gson的核心用法之一,它接收一个JSON格式的字符串和一个Java类的Class对象作为参数。Gson会尝试将JSON字符串转换为指定类的实例。在这个例子中,它会将json字符串转换为MyJson类的一个对象。

  • 更新UI: textView.setText(myJson.getDate()); 这行代码假设在一个Android环境下,通过setText方法将从JSON中解析出的日期设置到一个名为textView的TextView组件上显示。这里调用了MyJson类的getDate方法来获取日期字符串。

private void GsonJson(String json){// 实例化Gson对象,Gson是Google开发的用来简化JSON解析和生成的库Gson gson = new Gson();try {// 使用Gson的fromJson方法,将JSON字符串转换为MyJson对象// 这要求MyJson类的结构必须与JSON数据结构相对应// MyJson类包含date字段以及一个嵌套的CityInfo对象MyJson myJson = gson.fromJson(json, MyJson.class);// 更新UI组件,将解析出的日期数据显示在textView中// 确保此操作在主线程中执行,避免UI更新的线程安全问题textView.setText(myJson.getDate());// 获取MyJson对象中的CityInfo对象,并从中读取city字段的值// 将城市名称显示在textView2中textView2.setText(myJson.getCityInfo().getCity());} catch (Exception e) {// 捕获并处理可能发生的异常,例如JSON数据格式不匹配或UI更新问题// 实际应用中可能需要更具体的异常处理逻辑Log.e("JsonParsingError", "解析JSON数据时发生错误: " + e.getMessage());}
}

MyJson 类

  • 定义数据结构: MyJson 类定义了一个简单的数据模型,用来匹配JSON数据中的结构。在这个例子中,只定义了一个字段date,用于存储日期字符串。

  • getter方法: getDate() 是一个标准的getter方法,用于获取date字段的值。在GsonJson方法中,通过这个getter方法访问解析后的日期信息。

public class MyJson {// 定义一个私有字段,用于存储日期信息private String date;// 定义一个内部类,表示城市信息private CityInfo cityInfo;// 获取日期的方法public String getDate() {return date;}// 获取城市信息的方法public CityInfo getCityInfo() {return cityInfo;}// 内部类 CityInfo,用来封装城市信息private class CityInfo {// 城市名称的私有字段private String city;// 获取城市名称的方法public String getCity() {return city;}}
}

六、最总结果

目标:

json:

解析结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/32678.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电容的命名规则

给如下参数给采购&#xff0c;就可以获取 还有一些参数需要重视 容值随着环境温度而保持的程度 常规应用时是可以不用看材质&#xff0c;但是如果使用在新能源汽车和极端环境下的电子产品&#xff0c;就需要关注材质&#xff0c;曾有供应商把可用级电容供应车企&#xff0c;导致…

昇思25天学习打卡营第4天|数据变换Transforms

学习内容复盘 1.1 数据变换 什么是数据变换、为何要数据变换 通常情况下&#xff0c;直接加载的原始数据并不能直接送入神经网络进行训练&#xff0c;此时我们需要对其进行数据预处理。MindSpore提供不同种类的数据变换&#xff08;Transforms&#xff09;&#xff0c;配合数…

学习VXLAN -- 报文结构、原理和配置

目录 VXLAN背景什么是VXLANVXLAN的优势VXLAN报文结构一些特定名词BDVBDIFVAPVSIVSI-InterfaceAC VXLAN的实现原理图VXLAN MAC地址表项MAC地址动态学习 VXLAN隧道VXLAN隧道工作模式L2 GatewayIP Gateway VXLAN隧道的建立与关联VXLAN隧道建立的方式VXLAN对到与VXLAN关联的方式 配…

低成本STC32G8K64驱动控制BLDC开源入门学习方案

低成本STC32G8K64驱动控制BLDC开源入门学习方案 ✨采用STC32G8K64单片机&#xff0c;参考梁工的STC32G12K128-LQFP48驱动方案制作&#xff0c;梁工BLDC相关的资料&#xff1a;https://www.stcaimcu.com/forum.php?modviewthread&tid7472&extrapage%3D1&#xff0c;在此…

python tarfile解压失败怎么解决

问题原因 在使用tarfile模块解压一份Linux服务器上的打包文件时&#xff0c;出现了错误提示&#xff1a;IOError&#xff1a;[Errno 22] invalid mode (wb) or filename. 经过检查&#xff0c;发现是因为打包文件中有文件名存在“&#xff1a;”符号&#xff0c;而window下的…

python rename报错怎么解决

刚接触python&#xff0c;写了一段简单的代码&#xff0c;功能就是重命名一个文件&#xff0c;代码如下&#xff1a; list_1os.listdir(".") for files in list_1:fopen(files)if f.name"01.txt":os.rename(01.txt,001.txt)elif f.name"05.txt":…

【Python机器学习】k均值聚类——k均值的失败案例

k均值可能不总能找到“正确”的簇个数&#xff0c;每个簇仅由其中心定义&#xff0c;这意味着每个簇都是凸形。因此&#xff0c;k均值只能找到相对简单的形状。k均值还假设所有簇在某种程度上具有相同的“直径”&#xff0c;它总是将簇之间的边界刚好画在簇中心的之间位置。有时…

找不到msvcr120.dll怎么办,msvcr120.dll丢失的多种解决方法

msvcr120.dll是微软Visual C 2013的可再发行组件包中的一个文件&#xff0c;它是许多程序运行所必需的。这个文件包含了Visual C库&#xff0c;这些库为使用C编写的软件提供支持。如果你的电脑中缺少msvcr120.dll文件&#xff0c;那么依赖这个文件运行的应用程序可能无法启动或…

WPF文本绑定显示格式StringFormat设置-数值类型处理

绑定显示格式设置 在Textblock等文本控件中&#xff0c;我们经常要绑定一些数据类型&#xff0c;但是我们希望显示的时候能够按照我们想要的格式去显示&#xff0c;比如增加文本前缀&#xff0c;后面加单位&#xff0c;显示百分号等等&#xff0c;这种就需要对绑定格式进行处理…

关于微信没有接入鸿蒙NEXT的思考

6月21日,纯血鸿蒙发布,国内的质疑声终于停止,不再被人喊叫换皮 Android 了.就连编程语言都是华为自研的。 可是发布会后微信却成了热点,因为余承东在感谢了一圈互联网企业,如:淘宝、支付宝、美团、京东、抖音、今日头条、钉钉、小红书、微博、B站、高德、WPS等等. 唯独没有感…

CSS基础学习记录(5)

目录 1、CSS语法 2、实例 3、CSS注释 4、id 选择器 5、class 类选择器 6、标签选择器 7、内联选择器 1、CSS语法 CSS 规则由两个主要的部分构成&#xff1a;选择器&#xff0c;以及一条或多条声明: 选择器&#xff08;Selector&#xff09;通常是您需要改变样式的 HTML …

Altera不同系列的型号命名规则

Altera芯片型号&#xff1a;10AX07H4F34I3SG 20nm工艺 资源&#xff1a; 大数据 云计算 人工智能 图像处理 MSEL

高级人工智能复习 中科大

参考&#xff1a; 中科大2023春季【高级人工智能】试题回顾 中国科学技术大学《高级人工智能》课程 重要知识点提纲 高级人工智能复习提纲 1.搜索 1.1 搜索问题的概念 搜索问题的五个要素&#xff1a;状态空间、后继函数、初始状态、目标测试和路径耗散。 用状态图描述搜索…

Codeforces Round 953 (Div. 2) A~F

A.Alice and Books&#xff08;思维&#xff09; 题意&#xff1a; 爱丽丝有 n n n本书。第 1 1 1本书包含 a 1 a_1 a1​页&#xff0c;第 2 2 2本书包含 a 2 a_2 a2​页&#xff0c; … \ldots …第 n n n本书包含 a n a_n an​页。爱丽丝的操作如下&#xff1a; 她把所有的…

L57---112.路径总和(广搜)---Java版

1.题目描述 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;这条路径上所有节点值相加等于目标和 targetSum 。如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。叶子节点 是指…

力扣每日一题 6/23 字符串/模拟

博客主页&#xff1a;誓则盟约系列专栏&#xff1a;IT竞赛 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 520.检测大写字母【简单】 题目&#xff1a; 我们定义&#xff0c;在以下…

面试必考题 CSS的居中布局

CSS居中对齐的几种方式 使用flex布局利用css3中的flex弹性盒的属性利用子元素auto 使用grid布局使用定位使用定位与margin利用CSS3属性transform 使用文本对齐使用table布局 使用flex布局 利用css3中的flex弹性盒的属性 .parent {display: flex;justify-content: center;alig…

经典面试题【作用域、闭包、变量提升】,带你深入理解掌握!

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;我是前端菜鸟的自我修养&#xff01;今天给大家分享经典面试题【作用域、闭包、变量提升】&#xff0c;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;原创不易&#xff0c;如果能帮助到带大家&#xff0…

欧洲杯赛况@20240622

点击标题下「蓝色微信名」可快速关注 斯洛伐克对阵乌克兰&#xff0c;场面上大开大合&#xff0c;施兰茨连场进球&#xff0c;但这次乌克兰丢球后没泄气&#xff0c;连进两球反超&#xff0c; 从数据统计上&#xff0c;两队不相上下&#xff0c;这个小组的形势更加复杂了&#…

【ajax核心05】宏任务与微任务

ES6之后引入Promise对象(用来管理异步任务)&#xff0c;让JS引擎也可以发起异步任务 一&#xff1a;异步任务分类 异步任务分为&#xff1a;宏任务与微任务 宏任务 由浏览器环境执行的异步代码 具体宏任务分类 微任务 由JS引擎执行的代码 创建Promise对象时&#xff0c;…