Okhttp响应Json数据

news2025/1/15 13:37:35

简介

        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:

解析结果:

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

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

相关文章

【教学类65-01】20240622秘密花园涂色书01(通义万相)(A4横版2张,一大3小 38张纸76份)

背景需求&#xff1a; 用通义万相制作秘密花园涂色书 关键词&#xff08;中文&#xff09;&#xff1a;秘密花园涂色书&#xff0c;简单笔画&#xff0c;卡通&#xff0c;黑白轮廓&#xff0c;未着色&#xff0c;幼儿插图&#xff0c;线条画&#xff0c;没有背景&#xff0c;没…

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

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

Failed to establish a new connection: [WinError 10061] 由于目标计算机积极拒绝,无法连接

在进行参数化读取时发现一个问题&#xff1a; 发现问题&#xff1a; requests.exceptions.ConnectionError: HTTPConnectionPool(hostlocalhost, port8081): Max retries exceeded with url: /jwshoplogin/user/update_information.do (Caused by NewConnectionError(<url…

尚品汇-(五)

商品管理模块开发 下面用到的表&#xff1a; 属性表&#xff1a; 属性值表&#xff1a; 分类一表&#xff1a; 分类二表&#xff1a; 分类三表&#xff1a; 1.1在service 模块下搭建service-product 搭建过程同common-util 添加配置文件application.yml spring:applicatio…

江协科技51单片机学习- p16 矩阵键盘

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

Linux中web集群-nginx负载均衡及案例

概述 代理&#xff1a;外卖&#xff0c;中介&#xff0c;中间商&#xff0c;用户无法直接做事情&#xff0c;通过中介进行处理 用户–》代理–》节点&#xff0c;后面只有一个节点&#xff0c;一般使用的是nginx代理功能即可&#xff0c;如果是集群就需要使用nginx负载均衡 …

【QT】Widget

目录 widget常用属性及其作用 enabled geomtry window frame window frame的影响 相关API windowTitle windowIcon qrc机制 qrc使用方式 自定义鼠标图片 设置字体样式 设置鼠标悬停提示 toolTip 控件获取焦点 styleSheet widget常用属性及其作用 属性作用…

C# 类中访问修饰符的优先级

参考链接 : C# 指南 - .NET 托管语言 | Microsoft Learn 访问修饰符 - C# | Microsoft Learn

Stable Diffusion初体验——基于机器学习通过神经网络的强大AI平台

文章目录 前言最新热门活动&#xff01;&#xff01;平台介绍 一.创建应用 Stable Diffusion WebUI初始化上传模型&#xff0c;VAE&#xff0c;lora 介绍sd模型&#xff0c;vae&#xff0c;lora模型进入应用文生图工作区调参区图生图 结语小程序活动——6.20火热上线&#x1f5…

【b站-湖科大教书匠】2 物理层-计算机网络微课堂

课程地址&#xff1a;【计算机网络微课堂&#xff08;有字幕无背景音乐版&#xff09;】 https://www.bilibili.com/video/BV1c4411d7jb/?share_sourcecopy_web&vd_sourceb1cb921b73fe3808550eaf2224d1c155 目录 2 物理层 2.1 物理层的基本概念 2.2 物理层下面的传输媒…

Web渗透:文件上传-后端过滤

在上一篇文件上传的内容中笔者阐述了文件上传漏洞产生的相关原理以及使用了一个pikachu靶场的例子进行演示&#xff0c;在这个例子中涉及到了前端代码对于文件上传漏洞的相关防护&#xff0c;以及站在攻击者的角度我们要如何绕过前端的防护成功进行攻击&#xff1b;但是事实上对…

每日签到页面模板组件,简单好用,用了会上瘾的那种

uni-app 是一个使用 Vue.js 开发所有前端应用的框架&#xff0c;开发者编写一套代码&#xff0c;可发布到iOS、Android、Web&#xff08;响应式&#xff09;、以及各种小程序&#xff08;微信/支付宝/百度/头条/飞书/QQ/快手/钉钉/淘宝&#xff09;、快应用等多个平台。 今日给…

Django之云存储(二)

一、Django使用云存储 建立项目 django-admin startproject project_demo创建子应用 python manage.py startapp app_name修改配置文件,设置模板视图路径 settings.py TEMPLATES = [{BACKEND: django.template.backends.django.DjangoTemplates,DIRS: [os.path.join(BASE_DIR,…

【Unity服务器01】之AssetBundle上传加载u3d模型

首先打开一个项目导入一个简单的场景 导入怪物资源&#xff0c; AssetBundle知识点&#xff1a; 1.指定资源的AssetBundle属性标签 &#xff08;1&#xff09;找到AssetBundle属性标签 &#xff08;2&#xff09;A标签 代表&#xff1a;资源目录&#xff08;决定打包之后在哪…

微信小程序之横向列表展示

效果图 参考微信小程序可看 代码&#xff1a; <view class"lbtClass"><view class"swiper-container"><scroll-view class"swiper" scroll-x"true" :scroll-left"scrollLeft"><block v-for"(six…

怎么用Excel生成标签打印模板,自动生成二维码

环境&#xff1a; EXCEL2021 16.0 问题描述&#xff1a; 怎么用excel生成标签打印模板自动生成二维码 解决方案&#xff1a; 在Excel中生成标签打印模板并自动生成二维码&#xff0c;可以通过以下几个步骤完成&#xff1a; 1. 准备数据 首先&#xff0c;确保你的Excel表…

C#.net6.0+sqlserver2019医院手术麻醉信息管理系统源码 可对接院内HIS、LIS、PACS 支持二次开发

C#.net6.0sqlserver2019医院手术麻醉信息管理系统源码 可对接院内HIS、LIS、PACS 支持二次开发 手麻系统的功能涵盖了麻醉临床业务管理、麻醉运营业务管理以及手术进程管理等&#xff0c;实现了将多种麻醉病历文书与医院HIS系统的有效关联&#xff0c;让手术室人员、设备资源和…

鹅算法(GOOSE Algorithm,GOOSE)求解复杂城市地形下无人机避障三维航迹规划,可以修改障碍物及起始点(Matlab代码)

一、鹅算法 鹅优化算法&#xff08;GOOSE Algorithm&#xff0c;GOOSE)从鹅的休息和觅食行为获得灵感&#xff0c;当鹅听到任何奇怪的声音或动作时&#xff0c;它们会发出响亮的声音来唤醒群中的个体&#xff0c;并保证它们的安全。 参考文献 [1]Hamad R K, Rashid T A. GOO…

day16--513.找树左下角的值+112. 路径总和+106.从中序与后序遍历序列构造二叉树

一、513.找树左下角的值 题目链接&#xff1a;https://leetcode.cn/problems/find-bottom-left-tree-value/ 文章讲解&#xff1a;https://programmercarl.com/0513.%E6%89%BE%E6%A0%91%E5%B7%A6%E4%B8%8B%E8%A7%92%E7%9A%84%E5%80%BC.html 视频讲解&#xff1a;https://www.b…

JavaSE基础总结复习之面向对象の知识总结

目录 Java语言的基础特点 面向对象 类和对象 类 类的构造 一&#xff0c;发现类 二&#xff0c;发现类的共有属性&#xff08;成员变量&#xff09; 三&#xff0c;定义类的成员方法&#xff08;行为&#xff0c;动词&#xff09; 四&#xff0c;使用类创建对象 对象…