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() {
            @Override
            public 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:

解析结果:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【目标检测】Yolov8 完整教程 | 检测 | 计算机视觉

学习资源&#xff1a;https://www.youtube.com/watch?vZ-65nqxUdl4 努力的小巴掌 记录计算机视觉学习道路上的所思所得。 1、准备图片images 收集数据网站&#xff1a;OPEN IMAGES 2、准备标签labels 网站&#xff1a;CVAT 有点是&#xff1a;支持直接导出yolo格式的标…

Flutter实现页面间传参

带参跳转 步骤 在router中配置这个路由需要携带的参数,这里的参数是 arguments,注意要用花括号包裹参数名称 在相应组件中实现带参构造函数 在state类中可以直接使用${widget.arguments}来访问到传递的参数 在其他页面中使用Navigator.pushNamed()带参跳转

ansible自动化运维,(2)ansible-playbook

三种常见的数据格式&#xff1a; XML&#xff1a;可扩展标记语言&#xff0c;用于数据交换和配置 JSON&#xff1a;对象标记法&#xff0c;主要用来数据交换或配置&#xff0c;不支持注释 YAML&#xff1a;不是一种标记语言&#xff0c;主要用来配置&#xff0c;大小写敏感&…

BUG cn.bing.com 重定向的次数过多,无法搜索内容

BUG cn.bing.com 重定向的次数过多&#xff0c;无法搜索内容 环境 windows 11 edge浏览器详情 使用Microsoft Edge 必应搜索显示"cn.bing.com"重定向次数过多&#xff0c;无法进行正常的检索功能 解决办法 检查是否开启某些科_学_上_网&#xff08;翻_墙&#xf…

电脑高手推荐:三款超实用软件,让你的电脑如虎添翼!

7Zip 7-Zip是一款免费且开源的文件压缩工具&#xff0c;支持多种文件格式&#xff0c;包括其自带的7z格式、ZIP、GZIP、BZIP2和TAR等。该软件由Igor Pavlov于1999年开发&#xff0c;具有高压缩比的特点。7-Zip不仅可以在Windows操作系统上使用&#xff0c;还可以在Unix-like的操…

做到这九点,工作就无后顾之忧

大家好&#xff0c;今天又跟大家分享一篇&#xff0c;怎么在职场上做到挺起腰杆做事。全文共分9点&#xff0c;尤其最后一点最为重要。篇幅有点长&#xff0c;全文共计三千多字&#xff0c;请耐心看完。 如果您觉得对您有些帮助&#xff0c;点赞收藏关注。谢谢您的支持。 在职场…

LDO芯片手册,实例应用分析

在进行电路设计时LDO是经常用到的&#xff0c;尤其在为芯片&#xff0c;晶振等敏感电路进行供电时应用更多&#xff0c;下面选取一款比较常用的LDO芯片&#xff0c;一起进行更深入的学习。 SGM2036特点简介 SGM2036&#xff0c;圣邦微一款比较常用的LDO芯片手册 可以先大致看…

广州数据中心机房搬迁验收要求

1.验收要求 新机房装修工程全部竣工&#xff0c;各类环境设备安装到位&#xff0c;包括空调、UPS、柴油发电机等设备安装调试完毕&#xff0c;机房接地、防雷、消防系统检验合格&#xff0c;机房综合布线工作完成&#xff0c;机房各项环境指标达标&#xff0c;机房整体通过验收…

MySQL连接

MySQL工具包 MySQL实现简单链接 一 引入工具包 JBDCUtils&#xff0c;无需更改&#xff0c;直接使用即可。 import java.io.IOException; import java.io.InputStream; import java.sql.*; import java.util.Properties;public class JDBCUtil {private static String URL;p…

mapstruct实现各个实体间的类型转换(DTO转BO、BO转Entity)的实践

一、引入 在没有遇见mapstruct的时候&#xff0c;实现各个实体之间的转换&#xff0c;都是手动转换实现的&#xff0c;属性少一带你还好&#xff0c;当属性一多&#xff0c;代码就会变得很冗余&#xff0c;没必要的非逻辑的代码就会加多。。。。 比如&#xff1a; public cl…

Python+Pytest+Yaml+Request+Allure+GitLab+Jenkins接口自动化测试框架概解

PythonPytestYamlAllure整体框架目录&#xff08;源代码请等下篇&#xff09; 框架详解 common:公共方法包 –get_path.py:获取文件路径方法 –logger_util.py:输出日志方法 –parameters_until.py&#xff1a;传参方式方法封装 –requests_util.py&#xff1a;请求方式方法封…

洗地机怎么选择最好?四大洗地机精选放心入手

在当今生活节奏飞快的社会中&#xff0c;人们越来越渴望拥有一款高性能、实用方便的家用洗地机&#xff0c;能够帮助我们节省大量的清洁时间。因为洗地机它是吸尘器的升级版&#xff0c;清洁力比扫地机器人更强&#xff0c;洗地机通过高速旋转的风机&#xff0c;产生超大吸力&a…

无源电压继电器 JDY-1210AW 导轨安装 约瑟JOSEF

系列型号&#xff1a; JDY-1002AW电压继电器&#xff1b;JDY-1002B电压继电器&#xff1b; JDY-1110AW电压继电器&#xff1b;JDY-1110B电压继电器&#xff1b; JDY-1220AW电压继电器&#xff1b;JDY-1220B电压继电器&#xff1b; JDY-1100AW电压继电器&#xff1b;JDY-110…

昇思25天学习打卡营第一天|快速入门

背景 华为组织了昇思25天学习营&#xff0c;从基础开始&#xff0c;提供算力支持&#xff0c;还是体验蛮好的。推荐大家报名参加。 学习内容 今天的内容是快速入门&#xff0c;很简单&#xff0c;当是复习基础内容了。 下载数据集》模型组网》模型训练》保存模型&#xff0c…

mongodb 查询语句学习笔记

基础查询 正则查询 {status: A,$or: [{ qty: { $lt: 30 } }, { item: { $regex: ^p } }] }AND 查询 { "size.h": { $lt: 15 }, "size.uom": "in", status: "D" }OR 查询 { $or: [ { status: "A" }, { qty: { $lt: 30 } …

进程、CPU、MMU与PCB之间的关系

目录 进程与cpu&#xff08;中央处理器&#xff09; 源代码、程序、cpu与进程的关系 cpu超线程 CPU的简易架构与处理数据过程 进程与MMU&#xff08;内存管理单元&#xff09; mmu作用 cpu和mmu的关系 进程与PCB&#xff08;进程控制块&#xff09; PCB介绍与内部成员…

嵌入式项目分享| 终极智能手表,全过程+全开源分享

这是一个非常完整的智能手表开源项目,功能齐全,且资料开源,如果你是:自己平时喜欢diy的工程师,想要提升开发技能的学生,马上要做毕设的大四学生,这个手表很值得一做,别错过了~~ 所有开源的资料以及原文链接见文末。 先来看下这个手表的功能: 首先,是一个可以佩戴的手…

如何在 SwiftUI 视图中显示应用图标和版本

文章目录 前言获取应用图标获取应用版本创建 SwiftUI 视图总结前言 在应用中显示应用图标和版本是为用户提供快速识别应用版本和变体的好方法,无论是内部用户(如测试人员或利益相关者)还是外部用户。 在本文中,我将展示如何创建一个可访问的 SwiftUI 视图,既能显示应用图…

【UE5.3】笔记4-自定义材质蓝图

正常来说&#xff0c;我们都是拿到什么材质用什么材质&#xff0c;那么我们如何去创建自定义的材质呢&#xff1f; 首先&#xff0c;创建MyMaterials文件夹用来存放我们自制的材质&#xff1b; 然后&#xff0c;右键创建一个材质&#xff0c;起个名字&#xff0c;双击打开&am…

深入学习Java1415新特性

一、超实用的Java14新特性 1.Java14新特性概述 2.环境安装 3.超实用新特性