【Android入门到项目实战-- 8.4】—— 如何解析JSON格式数据

news2024/10/2 12:23:01

目录

一、准备工作

二、使用JSONObject

三、使用GSON


        比起XML,JSON的主要优势在于它的体积更小,在网络上传输的时候可以更省流量,但缺点是语义性较差,看起来不直观。

一、准备工作

        还是使用前面文章的方法,在服务器上读取数据,可先移步学习如何创建小型服务器:https://blog.csdn.net/Tir_zhang/article/details/130462019?spm=1001.2014.3001.5501

        开始之前,在共享目录中新建一个get_data.json文件,然后编写内容如下:

[{"id":"5","version":"5.5","name":"Clash of Clans"},
{"id":"6","version":"7.0","name":"Boom Beach"},
{"id":"7","version":"3.5","name":"Clash Royale"}]

二、使用JSONObject

        解析JSON数据的方法有很多,可使用官方提供的JSONObject,也可以使用谷歌开源库GSON。

        在上一篇文章的项目基础上,继续修改。

        修改MainActivity代码如下:

        首先将HTTP请求的地址改为你的ip+json文件,得到服务器返回的数据后调用parseJSONWithJSONObject方法解析数据。

        由于在服务器中定义的是一个JSON数组,因此先将服务器返回的数据传入到一个JSONArray对象中,然后遍历这个对象,从中取出的每一个元素都是一个JSONObject对象,每个对象又包含id、name和version数据,调用getString()方法将数据取出。

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    TextView responseText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button sendRequest = (Button) findViewById(R.id.send_request);
        responseText = (TextView) findViewById(R.id.response_text);
        sendRequest.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.send_request) {
            sendRequestWithOkHttp();
        }
    }

    private void sendRequestWithOkHttp() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    OkHttpClient client = new OkHttpClient();
                    Request request = new Request.Builder()
                            .url("http://192.168.0.114/get_data.json")
                            .build();
                    Response response = client.newCall(request).execute();
                    String responseData = response.body().string();
                    parseJSONWithJSONObject(responseData);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
    private void parseJSONWithJSONObject(String jsonData) {
        try {
            JSONArray jsonArray = new JSONArray(jsonData);
            for (int i = 0; i < jsonArray.length(); i++) {
                JSONObject jsonObject = jsonArray.getJSONObject(i);
                String id = jsonObject.getString("id");
                String name = jsonObject.getString("name");
                String version = jsonObject.getString("version");
                Log.d("MainActivity", "id is " + id);
                Log.d("MainActivity", "name is " + name);
                Log.d("MainActivity", "version is " + version);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

效果如下:

        点击按钮,打印以下日志。

 

三、使用GSON

        GSON可以将一段JSON格式的字符串自动映射成一个对象,不需要再手动去编写代码进行解析。

        首先打开build.gradle文件,在dependencies闭包中添加如下内容:

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

        创建一个App类,并加入字段,如下:

public class App {

    private String id;

    private String name;

    private String version;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getVersion() {
        return version;
    }

    public void setVersion(String version) {
        this.version = version;
    }

}

        修改MainActivity代码如下:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    TextView responseText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button sendRequest = (Button) findViewById(R.id.send_request);
        responseText = (TextView) findViewById(R.id.response_text);
        sendRequest.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.send_request) {
            sendRequestWithOkHttp();
        }
    }

    private void sendRequestWithOkHttp() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    OkHttpClient client = new OkHttpClient();
                    Request request = new Request.Builder()
                            .url("http://192.168.0.114/get_data.json")
                            .build();
                    Response response = client.newCall(request).execute();
                    String responseData = response.body().string();
                    parseJSONWithGSON(responseData);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

    private void parseJSONWithGSON(String jsonData) {
        Gson gson = new Gson();
        List<App> appList = gson.fromJson(jsonData, new TypeToken<List<App>>() {}.getType());
        for (App app : appList) {
            Log.d("MainActivity", "id is " + app.getId());
            Log.d("MainActivity", "name is " + app.getName());
            Log.d("MainActivity", "version is " + app.getVersion());
        }
    }

}

效果和第一种方法一样。

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

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

相关文章

【C++】STL标准库之vector

STL标准库之vector vector类的简介常用的vector类的接口构造容量遍历及访问增删查改迭代器迭代器失效问题 vector类的简介 vector是大小可变数组的序列容器&#xff0c;与string相比&#xff0c;vector中可以存任何类型的数据&#xff0c;而string中存储的只能是字符类型。 因为…

第二十九章 使用消息订阅发布实现组件通信

PubSubJS库介绍 如果你想在React中使用第三方库来实现Pub/Sub机制&#xff0c;PubSubJS是一个不错的选择。它是一个轻量级的库&#xff0c;可以在浏览器和Node.js环境中使用。 PubSubJS提供了一个简单的API&#xff0c;可以让你在应用程序中订阅和发布消息。你可以使用npm来安…

大数据Doris(十):Doris基础介绍

文章目录 Doris基础介绍 一、基本概念 二、建表语法及参数解释 1、column_definition_list 2、index_definition_list 3、engine_type 4、key_type 5、table_comment 6、partition_desc 7、distribution_desc 8、rollup_list 9、properites 三、数据类型 Doris基础…

java合并数组的方法

在 Java中&#xff0c;数组是一种重要的数据结构&#xff0c;在 Java中数组的操作方式有两种&#xff0c;一种是直接使用数组来操作&#xff0c;另一种是通过引用计数或者双指针对数组进行操作。对于直接使用数组来操作的方式&#xff0c;我们可以通过两个方法来实现。 一种是将…

C++(多态中)

目录&#xff1a; 1.多态实现原理&#xff08;再剖析&#xff09; 2.析构函数加virtual 3.C11新增两个关键字 override 和 final 4.重载、覆盖&#xff08;重写&#xff09;、隐藏的对比 5.抽象类 1.多态实现原理&#xff08;再剖析&#xff09; 实现出多态的效果&#xff0c;我…

Docker之Docker Compose技术

目录 一、什么是docker compose? 二、安装docker compose 三、使用案例&#xff1a;部署一个简单的fastapi服务 (以下教程是基于环境已将安装了docker服务) 一、什么是docker compose? Compose是一个将多个docker容器组合部署的技术&#xff0c;能通过编写yaml配置文件…

IJCAI2023 | A Systematic Survey of Chemical Pre-trained Models(化学小分子预训练模型综述)

IJCAI_A Systematic Survey of Chemical Pre-trained Models 综述资料汇总(更新中&#xff0c;原文提供)&#xff1a;GitHub - junxia97/awesome-pretrain-on-molecules: [IJCAI 2023 survey track]A curated list of resources for chemical pre-trained models 参考资料&…

『python爬虫』09. bs4实战之下载精美壁纸(保姆级图文)

目录 爬取思路代码思路1.拿到主页面的源代码. 然后提取到子页面的链接地址, href2.通过href拿到子页面的内容. 从子页面中找到图片的下载地址 img -> src3.下载图片 3. 完整实现代码总结 欢迎关注 『python爬虫』 专栏&#xff0c;持续更新中 欢迎关注 『python爬虫』 专栏&…

docker 非持久化存储 tmpfs mounts

docker 非持久化存储 tmpfs mounts 简介tmpfs mounts 限制--tmpfs 和 --mount 之间的差异在容器中使用 tmpfs mounts指定 tmpfs 选项 简介 官方文档&#xff1a;https://docs.docker.com/storage/tmpfs/ 与 volume 和 bind mounts 不同&#xff0c;tmpfs mounts 是临时的&…

jdk中juc多线程编程工具

jdk线程池实现原理分析 目录 CompletionService CompletableFuture 基本原理 CompletableFuture的接口 静态方法 handle() vs whenComplete() xxxEither() 异常处理exceptionally() 获取任务结果 结束任务 Semaphore CyclicBarrier CountDownLatch jdk线程池实…

《斯坦福数据挖掘教程·第三版》读书笔记(英文版)Chapter 4 Mining Data Streams

来源&#xff1a;《斯坦福数据挖掘教程第三版》对应的公开英文书和PPT Chapter 4 Mining Data Streams &#x1f4a1; Skip this chapter due to its difficulty and for me, it is hard to understand. Summary of Chapter 4 The Stream Data Model: This model assumes da…

【微机原理】半导体存储器

目录 一.半导体存储器的分类 二、半导体存储器性能指标 三、半导体存储器的结构 一.半导体存储器的分类 半导体存储器的分类方法有很多种。 1.按器件原理来分&#xff1a;有双极型存储器和MOS型存储器。 双极型&#xff1a;速度快、集成度低、功耗大MOS型&#xff1a;速度慢、集…

“ 探索迷局:解密广度寻路算法 “

专栏文章&#xff0c;自下而上 数据结构与算法——二叉搜索树 数据结构与算法——深度寻路算法 数据结构与算法——二叉树实现表达式树 数据结构与算法——树(三指针描述一棵树&#xff09; 数据结构与算法——栈和队列&#xff1c;也不过如此&#xff1e; 数据结构与算法——八…

C++的智能指针

文章目录 1. 内存泄漏1.1 什么是内存泄漏1.2 内存泄漏分类 2. 为什么需要智能指针3. 智能指针的使用及原理3.1 RAII3.2 使用RAII思想设计的SmartPtr类3.3 让SmartPtr像指针一样3.3 SmartPtr的拷贝3.4 auto_ptr3.5 unique_ptr3.6 shared_ptr3.6.1 shared_ptr的循环引用3.6.2 wea…

MYSQL-数据库管理(上)

一、数据库概述 一、数据库基本概念 1.1 数据 1&#xff09; 描述事物的符号记录称为数据&#xff08;Data&#xff09;。数字、文字、图形、图像、声音、档案记录等 都是数据。 2&#xff09;数据是以“记录”的形式按照统一的格式进行存储的&#xff0c;而不是杂乱无章的。…

机器学习之分类决策树与回归决策树—基于python实现

大家好&#xff0c;我是带我去滑雪&#xff01; 本期为大家介绍决策树算法&#xff0c;它一种基学习器&#xff0c;广泛应用于集成学习&#xff0c;用于大幅度提高模型的预测准确率。决策树在分区域时&#xff0c;会考虑特征向量对响应变量的影响&#xff0c;且每次仅使用一个分…

vs编译生成动态库

说明 windows版本&#xff0c;vs2019 创建一个动态库 新建一c项目&#xff0c;创建一个dll类型项目。 在头文件中添加一个mylib.h文件&#xff1a; #pragma once#ifndef MYLIB_H #define MYLIB_Hextern "C" __declspec(dllexport) void Hello(); extern "C…

UG NX二次开发(C++)-建模-修改NXObject或者Feature的颜色(一)

文章目录 1、前言2、在UG NX中修改Feature的颜色操作3、采用NXOpen(C)实现3.1 创建修改特征的方法3.2 调用ModifyFeatureColor方法3.3 测试结果 1、前言 在UG NX中&#xff0c;改变NXObject和Feature的操作是不相同的&#xff0c;所以其二次开发的代码也不一样&#xff0c;我们…

优化问题的拉格朗日Lagrange对偶法原理

首先我们定义一般形式的求解x的优化问题&#xff1a; 表示优化的目标函数&#xff0c;上述为最小优化&#xff0c;实际上最大优化可以改写为的形式表示第i个不等式约束表示等式约束 1. Lagrange对偶问题 上述优化问题的拉格朗日Lagrange对偶法求解&#xff0c;是将上述带约束…

Baumer工业相机堡盟工业相机如何联合BGAPISDK和Halcon实现图像的直方图算法增强(C#)

Baumer工业相机堡盟工业相机如何联合BGAPISDK和Halcon实现图像的直方图算法增强&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机使用图像算法增加图像的技术背景Baumer工业相机通过BGAPI SDK联合Halcon使用直方图图像增强算法1.引用合适的类文件2.BGAPI SDK在图像回调…