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

news/2025/1/31 9:35:20/

目录

一、准备工作

二、使用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;@Overrideprotected 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);}@Overridepublic void onClick(View v) {if (v.getId() == R.id.send_request) {sendRequestWithOkHttp();}}private void sendRequestWithOkHttp() {new Thread(new Runnable() {@Overridepublic 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;@Overrideprotected 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);}@Overridepublic void onClick(View v) {if (v.getId() == R.id.send_request) {sendRequestWithOkHttp();}}private void sendRequestWithOkHttp() {new Thread(new Runnable() {@Overridepublic 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.ppmy.cn/news/57758.html

相关文章

Android InputEventReceiver事件接收流程分析

本文基于Android 12。 InputEvent经过inputflinger读取后&#xff0c;通过Inputchannel发送到Java层的InputEventReceiver对象&#xff0c;输入事件和View的状态强相关&#xff0c;事件发送需要确定当前的焦点App&#xff0c;焦点Window&#xff08;View&#xff09;&#xff…

Chapter4:频率响应法(上)

第四章:频率响应法 Exercise4.1 已知微分网络和积分网络电路图如下图所示,求网络的频率特性。 解: 【图 ( a ) ({\rm a}) (a)微分网络】 由微分网络电路图可得:

PMP/高项 05-项目进度管理

项目进度管理 概念 项目进度管理&#xff08;Schedule Management) 项目进度管理又叫项目工期管理&#xff08;Duration Management)或项目的时间管理(Time Management) 是一种为管理项目按时完成项目所需的各个过程 进度管理过程 规划进度管理 定义活动 排列活动顺序 估算活…

24:若所有参数皆需类型转换,请为此采用non-member函数

令class支持隐式类型转换通常是个糟糕的主意。 这条规则有其例外&#xff0c;最常见的例外是在建立数值类型时。 例&#xff0c;假设你设计一个class用来表现有理数&#xff0c;则允许整数“隐式转换”为有理数就很合理。 class Rational{ public:Rational(int numerator0,i…

Listener监听器

什么是监听器&#xff1f; 监听器是Servlet规范中的一员。就像Filter一样。Filter也是Servlet规范中的一员。 在Servlet中&#xff0c;所有的监听器接口都是以“Listener”结尾。 监听器有什么用&#xff1f; 监听器实际上是Servlet规范留给我们javaweb程序员的特殊时机。 特殊…

shell脚本的判断式

文章目录 shell脚本的判断式利用test命令的测试功能关于某个文件名的【文件类型】判断关于文件的权限检测两个文件之间的比较关于两个整数之间的比较判定字符串的数据多重条件判定例题 利用判断符号[ ]例题 shell脚本的默认变量($0、$1...)例题shift&#xff1a;造成参数变量号…

docker运行PostgreSQL数据库维护,执行脚本备份数据库与更新表结构

文章目录 PostgreSQL简介业务场景数据库维护docker-compose配置备份脚本更新表结构脚本 PostgreSQL简介 PostgreSQL是一种开源的关系型数据库管理系统&#xff0c;它是一个功能强大、高度可定制化和支持复杂应用的数据库。它支持广泛的数据类型&#xff0c;包括数值、文字、二…

Java基础--->JVM(1)

文章目录 为什么学习JVM&#xff1f;什么是虚拟机&#xff1f;JVM的作用JVM组成部分类加载器类什么时候会被加载&#xff08;初始化&#xff09;有哪些类加载器什么是双亲委派机制如何打破双亲委派机制 为什么学习JVM&#xff1f; ​ 学习JVM是为了能更深入的理解Java这门语言&…