当前位置: 首页 > news >正文

JSON数据

一、JSON介绍

Android应用程序界面上的数据信息大部分都是通过网络请求从服务器上获取到的,获取到的数据类型常见的就是JSON。JSON是一种新的数据格式,这种格式的数据不可以直接显示到程序的界面上,需要将该数据解析为一个集合或对象的形式才可以显示到界面上。JSON的全称为JavaScript Obiect Notation,JSON表示一种轻量级的数据交互格式,它是基于JavaScript的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得JSON成为理想的数据交换语言,而且USON数据易于阅读和编写,同时也易于机器解析和生成,能够有效地提升网络的传输效率。
初学者可以使用JSON传输一个简单的数据,StringNumberBoolean类型的数据,也可以传输一个数组或者一个复杂的Object对象
JSOU数据有两种表示结构,对象结构和数组结构。

1.对象结构

对象结构的JSON数据以" { "开始,以" } "结束。中间部分由以“ “分隔的键值对 ( key : value )构成最后一个键值对后边不用加" , "、键(keg)和值(value)之间以" : "分隔。

基本语法格式:

{"key1": value1,"key2": value2,"key3": value3,... ...
}

 例:

{"city": "北京","street": "xiSanQi","number": 100096,"inWest":true 
}

2.数组结构

数组结构的ISON数据以" [ "开始,以" ] "结束。中间部分由0个或多个以" , "分隔的对象(value)的列表组成。

基本语法格式:

[value1,value2,value3,... ...
]

例:

(1)

["abc",123,true,null
]

(2)

本数组结构JSON中含两个对象结构JSON

[{"name": "王欣","sex": "女"},{"name": "王梓","sex": "女"}
]

(3)

本数组结构JSON中含两个对象结构JSON,对象结构JSON中含一个数组结构JSON

[{"name": "王欣","sex": "女","hobby": ["篮球","音乐","足球"]},{"name": "王梓","sex": "女","hobby": ["电影","游泳","羽毛球"]}
]

二、JSON解析

假设有两条JSON数据,json1和json2

json1: { "name":"张三" , "age":27 , "married":true }
json2: [ { "name":"李四" , "age":25 } , { "name":"王五" , "age":20 } ]

1.使用JSONObject类与JSONArray类解析JSON数据

(1)使用JSONObject类解析对象结构JSON数据

使用方法 new JSONObject( " 字符串型JSON " ) 获取JSONObject对象,然后使用optXXX(String valueName)方法获取JSON所含值

//根据字符串型的JSON信息获取JSONObject
JSONObject jsonObject=new JSONObject( "json1(字符串类型)" );
//获取内容值
String jsonName=jsonObject.optString("name");
int jsonAge=jsonObject.optInt("age");
boolean jsonMarried=jsonObject.optBoolean("married");
(2)使用JSONArray类解析数组结构JSON数据

使用方法 new JSONArray( " 字符串型JSON " ) 获取JSONArray对象,然后使用getJSONObject(int index)方法获取JSONObject对象,然后使用optXXX(String valueName)方法获取JSON所含值

//根据字符串型的JSON信息获取JSONArray
JSONArray jsonArray=new JSONArray( "json2(字符串类型)" );
//获取数组结构JSON中所含的各个对象结构JSON
for (int i=0;i<jsonArray.length();i++){//获取当前指针的JSONObject jsonObject=jsonArray.getJSONArray(i);//获取内容值对象结构JSONString jsonName=jsonObject.optString("name");int jsonAge=jsonObject.optInt("age");
}

以上两个类在解析JSON数据时用到了optString()方法,optInt()方法,optBoolean()方法,这些方法在解析数据结构是安全的,如果对应的字段不存在,这些方法会有默认的返回值

2.使用GSON库解析JSON数据

Google公司提供了一个Gson库用于解析JSON数据,使用前需将其添加到项目中
使用Gson前要创建JOSN数据对应的实体类,实体类中的成员名称必须与JSON数据中key值一致

例:

//自定义类
class Person{private String name;private int age;private boolean married;public String getName() {return name;}public int getAge() {return age;}public boolean getMarried() {return married;}public void setName(String name) {this.name = name;}public void setAge(int age) {this.age = age;}public void setMarried(boolean married) {this.married = married;}
}
(1)解析对象结构JSON

创建Gson对象;然后使用Gson类.fromJSON()方法,创建自定义类Person对象

//创建Gson对象
Gson gson=new Gson();
//使用Gson类.fromJSON()方法,创建自定义类Person对象
Person1 person1=gson.fromJSON( "json1(字符串类型)" , Person.class );
 (2)解析数组结构JSON(其中包含对象结构JSON)

创建Gson对象;使用new TypeToken<List<自定义类>>(){}.getType() (类型代币)创建Type对象;然后使用Gson类.fromJSON()方法,创建自定义类的List集合(List<Person>)。

//创建Gson对象
Gson gson=new Gson();
//创建Type对象
Type listType=new TypeToken<List<Person>>(){}.getType();
//使用Gson类.fromJSON()方法,创建自定义类的List集合(List<Person>)
List<Person> list=gson.formJSON( "json2(字符串类型)" , listType );

三、获取JSONObject、JSONArray对象

1.文件中获取

可使用输入流与StringBuilder配合,依靠StringBuilder生成完整的字符串型JSON数据

//创建文件输入流
InputStream inputStream=openFileInput(" ~ .json");
BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(inputStream));
//创建字符串构建器
StringBuilder stringBuilder=new StringBuilder();
while (true){String tempStr=bufferedReader.readLine();if(tempStr!=null){stringBuilder.append(tempStr);}else {break;}
}
//字符串构建器创建字符串
String jsonString=stringBuilder.toString();//生成JSONObject或JSONArray对象
JSONObject jsonObject=new JSONObject(jsonString);
JSONArray jsonArray=new JSONArray(jsonString);

2.服务器返回数据中获取

多数服务器返回JSON数据

//Response(响应)为服务器返回
Response response;
//获取ResponseBody
ResponseBody responseBody=response.body();
String jsonString=responseBody.toString();
//生成JSONObject或JSONArray对象
JSONObject jsonObject=new JSONObject(jsonString);
JSONArray jsonArray=new JSONArray(jsonString);

四、创建JSON数据

1.创建 .json 文件

main -> [new] -> [ Folder ] -> [Assets Folder] -> main -> assets -> [new] -> [File] 文件后缀为.json

2.程序中创建 JSONObject / JSONArray

//创建JSONObject 
JSONObject jsonObject=new JSONObject();
jsonObject.put("id","1");
jsonObject.put("name","王欣");//创建JSONArray
JSONArray jsonArray=new JSONArray();
jsonArray.put("王欣");
jsonArray.put("王梓");

相关文章:

JSON数据

一、JSON介绍 Android应用程序界面上的数据信息大部分都是通过网络请求从服务器上获取到的&#xff0c;获取到的数据类型常见的就是JSON。JSON是一种新的数据格式&#xff0c;这种格式的数据不可以直接显示到程序的界面上&#xff0c;需要将该数据解析为一个集合或对象的形式才…...

金融领域:怎么保持电力系统连续供应?

银行作为金融领域的关键机构&#xff0c;依赖于高度可靠的电力供应&#xff0c;以保持银行操作的连续性。在电力中断或电力质量问题的情况下&#xff0c;银行可能面临严重的风险&#xff0c;包括数据丢失、交易中断和客户满意度下降。 UPS监控系统在这一背景下变得至关重要&…...

批量重命名文件夹:用数字随机重命名法管理您的文件夹

在文件管理中&#xff0c;文件夹的命名是一项至关重要的任务。一个好的文件夹命名方案可以帮助我们更高效地组织和查找文件。然而&#xff0c;随着时间的推移&#xff0c;我们可能会遇到文件夹数量过多&#xff0c;难以管理和查找的问题。为了解决这个问题&#xff0c;我们可以…...

RPC与HTTP的关系

首选理清楚关系 RPC与HTTP是两个不同维度的东西 HTTP 协议&#xff08;Hyper Text Transfer Protocol&#xff09;&#xff0c;又叫做超文本传输协议&#xff0c;是一种传输协议&#xff0c;平时通过浏览器浏览网页网页&#xff0c;用到的就是 HTTP 协议。 而 RPC&#xff0…...

OpenCV #以图搜图:感知哈希算法(Perceptual hash algorithm)的原理与实验

1. 介绍 感知哈希算法&#xff08;Perceptual Hash Algorithm&#xff0c;简称pHash&#xff09; 是哈希算法的一种&#xff0c;主要用来做相似图片的搜索工作。 2. 原理 感知哈希算法&#xff08;pHash&#xff09;首先将原图像缩小成一个固定大小的像素图像&#xff0c;然后…...

Android多张图片rotation旋转角度叠加/重叠堆放

Android多张图片rotation旋转角度叠加/重叠堆放 <?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.android.com/apk/res-auto"…...

HBuilderX 自定义语法提示

在开发实践中&#xff0c;会使用到各种第三方组件&#xff0c;比如Element UI&#xff0c;通常的做法是到官网中复制模板再在本地根据设计要求进行修改&#xff0c;或是从其它已经实现的组件中复制相似的内容。但每次复制粘贴确实比较麻烦。 在HBuilderx中可以设置代码块来创建…...

Leetcode—2562.找出数组的串联值【简单】

2023每日刷题&#xff08;十四&#xff09; Leetcode—2562.找出数组的串联值 实现代码 long long findTheArrayConcVal(int* nums, int numsSize){int left 0;int right numsSize - 1;long long sum 0;while(left < right) {if(left right) {sum nums[left];break;}…...

T0外部计数输入

/*----------------------------------------------- 内容&#xff1a;通过外部按键计数进入中断执行LED取反 ------------------------------------------------*/ #include<reg52.h> //包含头文件&#xff0c;一般情况不需要改动&#xff0c;头文件包含特殊功能寄存器的…...

分治法求解棋盘覆盖问题

分治法求解棋盘覆盖问题 如何应用分治法求解棋盘覆盖问题呢&#xff1f;分治的技巧在于如何划分棋盘&#xff0c;使划分后的子棋盘的大小相同&#xff0c;并且每个子棋盘均包含一个特殊方格&#xff0c;从而将原问题分解为规模较小的棋盘覆盖问题。 基本思路 棋盘覆盖问题是…...

爱写bug的小邓程序员个人博客

博客网址: http://www.006969.xyz 欢迎来到我的个人博客&#xff0c;这里主要分享我对于前后端相关技术的学习笔记、项目实战经验以及一些技术感悟。 在我的博客中&#xff0c;你将看到以下主要内容&#xff1a; 技术文章 我将会分享我在学习前后端技术过程中的一些感悟&am…...

selenium判断元素可点击、可见、可选

1、判断元素是否可以点击 判断元素是否可以点击&#xff0c;WebElement对象调用is_enabled() is_enabled()方法返回一个布尔值&#xff0c;若可点击返回&#xff1a;True。若不可点击则返回&#xff1a;False from selenium import webdriver import time from selenium.web…...

计算机网络重点概念整理-第六章 应用层【期末复习|考研复习】

计算机网络复习系列文章传送门&#xff1a; 第一章 计算机网络概述 第二章 物理层 第三章 数据链路层 第四章 网络层 第五章 传输层 第六章 应用层 第七章 网络安全 计算机网络整理-简称&缩写 文章目录 前言六、应用层6.1 网络应用模型6.1.1 客户/服务器模式C/S模型6.1.2 P…...

html2pdf

页面布局时将需要保存在同一页pdf的dom元素用div包裹&#xff0c;并为该div添加class类名&#xff0c;例如.convertPDF&#xff0c;如果有多页创建多个.convertPDF这个div&#xff0c;再循环保存pdf即可 用到了html2canvas和JsPdf这两个插件&#xff0c;自行站内搜索安装 pdf页…...

css中页面元素隐藏

display:nonevisibility:hiddenopcity:0页面中不存在存在存在重排会不会不会重绘会会不一定自身绑定事件不触发不触发能触发transition不支持支持支持子元素可复原不能能不能被遮挡的元素可触发事件能能不能 其他&#xff1a; 1.设置height&#xff0c;width&#xff0c;margi…...

dp三步问题

三步问题 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 class Solution { public:int waysToStep(int n) {vector<int> dp(n1,1);if(n1) return 1;dp[1]1;dp[2]2;for(int i3; i<n1; i){dp[i] ((dp[i-1]dp[i-2])%1000000007dp[i-3])%100…...

结构体和联合体嵌套访问

在JSON项目中&#xff0c;使用了联合体和结构体之间的嵌套&#xff0c;但是在访问内部的联合体和结构体的时候出现了问题&#xff0c;这篇文章作为记录&#xff0c;也希望能帮助遇到相同问题的好伙伴。 struct lept_value {union {struct str{char *s;size_t len;};double n;}…...

Linux ———— 管理磁盘

&#xff08;一&#xff09;MBR硬盘与GPT硬盘 硬盘按分区表的格式可以分为MBR硬盘与GPT硬盘两种硬盘格式。 MBR 硬盘&#xff1a;使用的是旧的传统硬盘分区表格式&#xff0c;其硬盘分区表存储在MBR(Master Boot Record&#xff0c;主引导区记录&#xff09;内。MBR位于…...

文字的编码

1 字符的编码方式 1.1 ASCII 是“American Standard Code for Information Interchange”的缩写&#xff0c;美国信息交换标准代码。电脑毕竟是西方人发明的&#xff0c;他们常用字母就 26 个&#xff0c;区分大小写、加上标点符号也没超过 127 个&#xff0c;每个字符用一个字…...

21.9 Python 使用Selenium库

Selenium是一个自动化测试框架&#xff0c;主要用于Web应用程序的自动化测试。它可以模拟用户在浏览器中的操作&#xff0c;如打开网页、点击链接、填写表单等&#xff0c;并且可以在代码中实现条件判断、异常处理等功能。Selenium最初是用于测试Web应用程序的&#xff0c;但也…...

掌握MediaPipeUnityPlugin:从0到1的面部表情捕捉实践指南

掌握MediaPipeUnityPlugin&#xff1a;从0到1的面部表情捕捉实践指南 【免费下载链接】MediaPipeUnityPlugin Unity plugin to run MediaPipe 项目地址: https://gitcode.com/gh_mirrors/me/MediaPipeUnityPlugin 在Unity开发中&#xff0c;实现高精度面部表情捕捉常面临…...

Python自动化爬取企查查企业工商信息的实战技巧

1. Python爬取企查查数据的核心思路 企查查作为国内权威的企业信息查询平台&#xff0c;包含了大量有价值的工商注册信息。对于金融、证券行业的从业者来说&#xff0c;经常需要批量获取这些数据进行分析。手动一个个查询不仅效率低下&#xff0c;还容易出错。这时候Python自动…...

DeOldify图像上色服务Node.js调用实战:构建自动化批处理工具

DeOldify图像上色服务Node.js调用实战&#xff1a;构建自动化批处理工具 你是不是也遇到过这样的情况&#xff1f;手头有一大堆珍贵的老照片&#xff0c;都是黑白的&#xff0c;想给它们上色却无从下手。一张张手动处理&#xff1f;那得花多少时间啊。或者&#xff0c;你所在的…...

Madgwick算法详解:9轴IMU嵌入式姿态解算实战

1. Madgwick姿态解算算法库深度解析&#xff1a;面向9轴IMU的嵌入式实时姿态估计实现1.1 算法背景与工程定位Madgwick姿态解算算法由Sebastian Madgwick于2010年提出&#xff0c;是一种基于梯度下降优化的互补滤波器&#xff08;Complementary Filter&#xff09;&#xff0c;专…...

Docker Desktop部署Weaviate向量数据库:从配置到生产环境全流程

在Docker Desktop上部署Weaviate向量数据库的全流程。通过Docker Compose实现容器化&#xff0c;涵盖持久化存储、安全认证配置及text2vec-openai集成。提供Python/Java客户端连接示例&#xff0c;并针对端口冲突、数据持久化等常见问题给出实用解决方案&#xff0c;助力快速搭…...

FUTURE POLICE语音对齐系统:MySQL数据库集成与结果分析实战

FUTURE POLICE语音对齐系统&#xff1a;MySQL数据库集成与结果分析实战 1. 语音对齐数据管理的挑战与解决方案 语音识别与对齐技术正在改变我们处理音频内容的方式。FUTURE POLICE系统凭借其毫秒级精度的强制对齐能力&#xff0c;为语音数据处理树立了新标准。然而&#xff0…...

用Python可视化理解柯西-施瓦茨不等式:从向量内积到函数空间的几何直觉

用Python可视化理解柯西-施瓦茨不等式&#xff1a;从向量内积到函数空间的几何直觉 数学中的不等式往往蕴含着深刻的几何意义&#xff0c;柯西-施瓦茨不等式就是这样一个连接代数与几何的桥梁。对于数据科学和机器学习的学习者来说&#xff0c;理解这个不等式不仅能夯实数学基础…...

ThinkPad X1 Tablet Gen3 vs Gen2键盘对比:为何Gen3更适合改装Type-C?

ThinkPad X1 Tablet Gen3键盘Type-C改装全解析&#xff1a;为何它成为DIY玩家的终极选择&#xff1f; 在移动办公设备轻量化与模块化设计成为主流的今天&#xff0c;ThinkPad X1 Tablet系列凭借其独特的二合一形态和标志性键盘手感&#xff0c;始终保持着特殊地位。特别是第三代…...

DeepSeek API实战:如何用Python脚本绕过Postman直接调用(附完整代码)

DeepSeek API高效调用指南&#xff1a;Python脚本开发实战 在当今快节奏的开发环境中&#xff0c;效率是衡量开发者生产力的关键指标。传统API测试工具如Postman虽然功能强大&#xff0c;但在自动化流程和持续集成场景中往往显得笨重。本文将带你探索一种更轻量、更灵活的解决方…...

告别串口线!用STM32F103+W25Q64做个U盘式固件升级器(附完整Keil工程)

STM32SPI Flash打造零门槛U盘固件升级器&#xff1a;从原理到量产实战 在嵌入式设备维护和量产环节&#xff0c;固件升级一直是让开发者头疼的问题。传统串口升级需要专用线缆和上位机软件&#xff0c;而基于STM32和SPI Flash的U盘式升级方案&#xff0c;将复杂的刷机流程简化为…...