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

【Android】JSON的具体使用方法之数据格式,数据解析,GSON的使用

文章目录

  • JSON
    • 数据格式
      • 基本结构
      • 数据类型
    • 数据解析
      • 获取值的方法
      • 根据值的类型获取
  • GSON
    • 1. 添加Gson依赖
    • 2. 创建数据类
    • 3. 使用Gson
      • 序列化
      • 反序列化
    • 4. 其他问题
      • 处理嵌套对象
      • 字段名不一致

JSON

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人类阅读和编写,同时也易于机器解析和生成。

数据格式

基本结构

  1. 对象:由花括号{}包围,包含键值对。键是字符串,值可以是字符串、数字、对象、数组、布尔值或null。

    {"name": "John","age": 30,"married": true,"children": ["Anna", "Billy"],"address": {"street": "123 Main St","city": "New York"}
    }
    
  2. 数组:由方括号[]包围,包含一个有序的值列表。

    ["apple","banana","cherry"
    ]
    
  3. :可以是字符串、数字、对象、数组、布尔值或null。

数据类型

  • 字符串:必须用双引号包围。

    "name": "John"
    
  • 数字:可以是整数或浮点数,不需要引号。

    "age": 30,
    "height": 1.75
    
  • 对象:一个无序的键值对集合,键必须是字符串,值可以是任何合法的JSON数据。

    "address": {"street": "123 Main St","city": "New York"
    }
    
  • 数组:一个有序的值列表,值可以是任何合法的JSON数据。

    "children": ["Anna", "Billy"]
    
  • 布尔值truefalse

    "married": true
    
  • null:表示空值。

    "middle_name": null
    

示例

{"name": "John Doe","age": 30,"married": true,"children": [{"name": "Anna","age": 10},{"name": "Billy","age": 5}],"address": {"street": "123 Main St","city": "New York","zip": "10001"},"phone_numbers": ["123-456-7890", "987-654-3210"],"email": "john.doe@example.com","website": null
}

数据解析

在Java中,JSONObject类用于表示一个JSON对象,并提供了多种方法来获取其键对应的值。

获取值的方法

  1. opt(String key)

    • 根据键获取值,如果键不存在,则返回null
    • 推荐使用,因为不会抛出异常。
    JSONObject jsonObject = new JSONObject("{\"name\":\"John\", \"age\":30}");
    Object value = jsonObject.opt("name"); // 返回 "John"
    Object missingValue = jsonObject.opt("nonexistent"); // 返回 null
    
  2. get(String key)

    • 根据键获取值,如果键不存在,则抛出JSONException
    JSONObject jsonObject = new JSONObject("{\"name\":\"John\", \"age\":30}");
    Object value = jsonObject.get("name"); // 返回 "John"
    Object missingValue = jsonObject.get("nonexistent"); // 抛出 JSONException
    

根据值的类型获取

  1. optString(String key)

    • 根据键获取字符串值,如果键不存在或值不是字符串,则返回空字符串或null。
    String name = jsonObject.optString("name"); // 返回 "John"
    String missingName = jsonObject.optString("nonexistent"); // 返回 ""
    
  2. optInt(String key)

    • 根据键获取整数值,如果键不存在或值不是整数,则返回0或指定的默认值。
    int age = jsonObject.optInt("age"); // 返回 30
    int missingAge = jsonObject.optInt("nonexistent", -1); // 返回 -1
    
  3. optBoolean(String key)

    • 根据键获取布尔值,如果键不存在或值不是布尔值,则返回false或指定的默认值。
    boolean isMarried = jsonObject.optBoolean("married"); // 返回 true 或 false
    boolean missingMarried = jsonObject.optBoolean("nonexistent", true); // 返回 true
    
  4. optJSONObject(String key)

    • 根据键获取JSONObject对象,如果键不存在或值不是JSONObject,则返回null。
    JSONObject address = jsonObject.optJSONObject("address"); // 返回一个 JSONObject 对象或 null
    
  5. optJSONArray(String key)

    • 根据键获取JSONArray对象,如果键不存在或值不是JSONArray,则返回null。
    JSONArray children = jsonObject.optJSONArray("children"); // 返回一个 JSONArray 对象或 null
    

GSON

1. 添加Gson依赖

build.gradle文件中添加Gson依赖:

dependencies {implementation 'com.google.code.gson:gson:2.8.8'
}

2. 创建数据类

假设我们有一个代表用户的JSON数据,我们首先需要创建一个对应的数据类:

public class User {private String name;private int age;private boolean isMarried;//...
}

3. 使用Gson

在你的Activity或Fragment中使用Gson进行JSON序列化和反序列化。

序列化

对象转JSON

String userJson = gson.toJson(user);

public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 创建User对象User user = new User("John Doe", 30, true);// 创建Gson对象Gson gson = new Gson();// 将User对象序列化为JSONString userJson = gson.toJson(user);Log.d("MainActivity", "User JSON: " + userJson); // 输出: {"name":"John Doe","age":30,"isMarried":true}}
}

反序列化

JSON转对象

Gson gson = new Gson();

User user = gson.fromJson(userJson, User.class);

public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// JSON字符串String userJson = "{\"name\":\"John Doe\",\"age\":30,\"isMarried\":true}";// 创建Gson对象Gson gson = new Gson();// 将JSON字符串反序列化为User对象User user = gson.fromJson(userJson, User.class);Log.d("MainActivity", "User Name: " + user.getName()); // 输出: John DoeLog.d("MainActivity", "User Age: " + user.getAge()); // 输出: 30Log.d("MainActivity", "User Married: " + user.isMarried()); // 输出: true}
}

4. 其他问题

处理嵌套对象

创建相应的数据类,并使用Gson进行处理。

public class Address {private String street;private String city;//...
}public class User {private String name;private int age;private boolean isMarried;private Address address;//...
}

然后在Activity中使用Gson进行序列化和反序列化:

public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 创建嵌套的User对象Address address = new Address("123 Main St", "New York");User user = new User("John Doe", 30, true, address);// 创建Gson对象Gson gson = new Gson();// 将User对象序列化为JSONString userJson = gson.toJson(user);Log.d("MainActivity", "User JSON: " + userJson); // 输出嵌套的JSON字符串// 将嵌套的JSON字符串反序列化为User对象User userFromJson = gson.fromJson(userJson, User.class);Log.d("MainActivity", "User Name: " + userFromJson.getName()); // 输出: John DoeLog.d("MainActivity", "User Address: " + userFromJson.getAddress().getStreet()); // 输出: 123 Main St}
}

字段名不一致

在使用Gson进行JSON序列化和反序列化时,字段名不一致的问题可以通过@SerializedName注解来解决。@SerializedName注解允许你指定JSON中的字段名称与Java对象中的字段名称之间的映射。

  1. 假设我们有一个JSON字符串:
{"full_name": "John Doe","user_age": 30,"is_married": true
}
  1. 我们可以创建一个对应的数据类,并使用@SerializedName注解来处理字段名不一致的问题:
public class User {@SerializedName("full_name")private String name;@SerializedName("user_age")private int age;@SerializedName("is_married")private boolean isMarried;//...
}


感谢您的阅读
如有错误烦请指正


参考:

1. Android网络请求之JSON数据解析_哔哩哔哩_bilibili

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【总览】如何精读文献-经验分享
  • DC-5靶机渗透测试
  • 超赞!墙裂推荐这款开箱即用、永久免费的运维监控平台
  • Apple 智能基础语言模型
  • 【LVS】防火墙mark标记解决调度问题
  • 5、关于kali搭建vulhub
  • Datawhale X 魔搭 AI夏令营第四期 | AIGC文生图——可图Kolors-LoRA风格故事 Task1笔记
  • 雪花算法(Snowflake Algorithm)
  • C/C++字符串函数
  • LVS (Linux virual server)
  • 【ARM】ARM Cortex 处理器详细讲解
  • Upload 上传图标不显示
  • 【C#】StringComparer
  • 智能电话机器人的优势与挑战
  • 在mac上通过 MySQL 安装包安装 MySQL 之后,终端执行 mysql 命令报错 command not found: mysql
  • JS 中的深拷贝与浅拷贝
  • 时间复杂度分析经典问题——最大子序列和
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • Docker 笔记(2):Dockerfile
  • ES6系列(二)变量的解构赋值
  • LeetCode29.两数相除 JavaScript
  • Quartz初级教程
  • spring boot 整合mybatis 无法输出sql的问题
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • 分类模型——Logistics Regression
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 前嗅ForeSpider采集配置界面介绍
  • 我的zsh配置, 2019最新方案
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • 阿里云ACE认证学习知识点梳理
  • ​马来语翻译中文去哪比较好?
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • (1)Nginx简介和安装教程
  • (2)STM32单片机上位机
  • (el-Date-Picker)操作(不使用 ts):Element-plus 中 DatePicker 组件的使用及输出想要日期格式需求的解决过程
  • (八)Flink Join 连接
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (多级缓存)多级缓存
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (二开)Flink 修改源码拓展 SQL 语法
  • (一)、软硬件全开源智能手表,与手机互联,标配多表盘,功能丰富(ZSWatch-Zephyr)
  • (转)mysql使用Navicat 导出和导入数据库
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • *算法训练(leetcode)第四十天 | 647. 回文子串、516. 最长回文子序列
  • *算法训练(leetcode)第四十五天 | 101. 孤岛的总面积、102. 沉没孤岛、103. 水流问题、104. 建造最大岛屿
  • .equals()到底是什么意思?
  • .net core 6 集成和使用 mongodb
  • .NET Framework 4.6.2改进了WPF和安全性
  • .Net下C#针对Excel开发控件汇总(ClosedXML,EPPlus,NPOI)
  • @Controller和@RestController的区别?
  • @SpringBootApplication 包含的三个注解及其含义
  • [ 隧道技术 ] 反弹shell的集中常见方式(二)bash反弹shell
  • [000-01-022].第03节:RabbitMQ环境搭建
  • [2009][note]构成理想导体超材料的有源THz欺骗表面等离子激元开关——
  • [AutoSar]BSW_OS 01 priority ceiling protocol(PCP)