如何将对象转换成json字符串,以json格式输出,并获取到其中的特定字段

小王学习录

  • Json格式
    • 示例 1:简单的 JSON 对象
    • 示例 2:JSON 对象嵌套
    • 示例 3:JSON 数组
    • 示例 4:混合使用对象和数组
  • 使用Gson将java对象转换成json字符串
    • 哪些数据类型的对象可以使用Gson转换为json字符串
    • 如何使用Gson将java对象转换成json字符串
    • 代码及运行结果展示
  • 格式化json字符串
    • 代码及运行结果展示
  • 从json字符串中截取字段
    • 将json字符串解析为json对象
    • 获取特定字段的值
    • 将JsonElement(第二步获取到的值)转换为所需的数据类型
    • 代码及运行结果展示
  • Game over!!!

在这里插入图片描述

Json格式

关于Json格式,在UDP协议的博文中介绍自定义应用层协议时简单提到过,这里做一下详细解释。

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。其格式遵循以下规则:

数据由键值对(key-value pairs)构成,键(key)是字符串,值(value)可以是以下几种数据类型之一:

值可以是数字(整数或浮点数)。
值可以是字符串(在双引号 " 中)。
值可以是布尔值(true 或 false)。
值可以是 null。
值可以是对象(即另一个 JSON 对象,键值对用花括号 {} 包裹)。
值可以是数组(即一组有序的值,用方括号 [] 包裹)。
数据以键值对的形式成组出现,每对之间用逗号 , 分隔。

整个数据结构由花括号 {} 包裹。

以下是一些具体的 JSON 格式例子:

示例 1:简单的 JSON 对象

{"name": "John Doe","age": 30,"isEmployed": true,"city": "New York"
}

在这个例子中,我们有一个 JSON 对象,包含四个键值对:

“name” 键对应的值是字符串 “John Doe”。
“age” 键对应的值是数字 30。
“isEmployed” 键对应的值是布尔值 true。
“city” 键对应的值是字符串 “New York”。

示例 2:JSON 对象嵌套

{"person": {"name": "Jane Smith","contact": {"phone": "+1-555-1234","email": "jane.smith@example.com"}},"company": {"name": "Acme Inc.","address": {"street": "1 Main St","city": "San Francisco","country": "USA"}}
}

这个例子展示了 JSON 对象的嵌套。外层对象有两个键值对:

“person” 键对应的值是一个内嵌的 JSON 对象,描述一个人的信息。
“company” 键对应的值也是一个内嵌的 JSON 对象,描述一家公司的信息。

示例 3:JSON 数组

{"employees": [{"firstName": "Bill","lastName": "Gates"},{"firstName": "George","lastName": "Bush"},{"firstName": "Thomas","lastName": "Carter"}]
}

在这个例子中,JSON 对象有一个名为 “employees” 的键,其对应的值是一个数组。数组内包含三个元素,每个元素都是一个独立的 JSON 对象,分别描述了员工的姓名。

示例 4:混合使用对象和数组

{"menu": {"id": "file","value": "File","popup": {"menuitem": [{"value": "New", "onclick": "CreateNewDoc()"},{"value": "Open", "onclick": "OpenDoc()"},{"value": "Close", "onclick": "CloseDoc()"}]}}
}

这个例子展示了如何在一个 JSON 对象中同时使用嵌套的对象和数组。“menu” 键对应的值是一个对象,其中 “popup” 键对应的值又是一个对象,而这个对象的 “menuitem” 键对应的值则是一个数组,数组中的每个元素都是一个描述菜单项的 JSON 对象。

以上就是 JSON 格式的例子,它们都严格遵循 JSON 的语法规范,展示了如何用 JSON 表示各种复杂的数据结构。

使用Gson将java对象转换成json字符串

首先需要导入依赖

<dependencies><!-- Gson dependency --><dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.9.0</version> <!-- 或者您想使用的最新版本号 --></dependency>
</dependencies>

哪些数据类型的对象可以使用Gson转换为json字符串

new Gson().toJson() 方法可以将满足以下数据类型条件的对象转换为 JSON 字符串:

  1. Java 基本类型及其包装类:

boolean / Boolean
byte / Byte
short / Short
int / Integer
long / Long
float / Float
double / Double
char / Character
String

  1. 数组:

基本类型数组,如 int[]、String[]
对象数组,如 MyClass[]

  1. 集合:

List,如 ArrayList
Set,如 HashSet
Map<K, V>,如HashMap<String, MyClass>。注意,键(Key)必须是可序列化的类型,通常为字符串或数值。

  1. 自定义类:

POJO(Plain Old Java Object):包含属性(成员变量)和 getter/setter 方法的普通 Java
类。Gson 会将此类对象的属性转换为 JSON 对象的键值对。

  • 属性可以是上述基本类型、数组、集合或其它自定义类。
  • 属性需有对应的getter 方法(用于序列化)和 setter 方法(用于反序列化)。遵循 JavaBeans 规范时,默认情况下,Gson 能够识别名为 getProperty() 和 setProperty() 的方法。
  • 可以使用 @Expose、@SerializedName 等 Gson注解来控制哪些属性参与序列化与反序列化,以及属性在 JSON 中的键名。

枚举类型(enum):枚举常量会被转换为字符串,通常为常量名(默认)或通过 @SerializedName 注解指定的名称。

  1. 特殊类型:

(1) Date 类型:Gson 默认会将 Date 对象转换为自 1970-01-01T00:00:00Z(Unix 纪元)以来的毫秒数。可以通过GsonBuilder 设置自定义的日期格式处理器。
(2) null 值:在 JSON 中表示为 null。

总的来说,Gson能够处理大部分常见的 Java 数据类型,包括基本类型、容器类型(数组、集合)、自定义类以及一些特殊类型(如 Date)。只要对象的结构和数据类型符合 JSON 的规范,就可以使用 new Gson().toJson() 方法将其转换为 JSON 字符串。对于不满足默认序列化规则的复杂情况,Gson 提供了一系列注解和自定义类型适配器(TypeAdapter)机制来定制序列化和反序列化行为。

如何使用Gson将java对象转换成json字符串

只需一行代码就可以解决

System.out.println(new Gson().toJson(response));

下面对这行代码做详细解释:

  1. new Gson():

创建了一个 Gson 类的实例。Gson 是 Google 提供的一个用来处理 JSON (JavaScript Object
Notation) 数据的库,主要用于对象与 JSON 字符串之间的相互转换。

  1. .toJson(response):

调用了 Gson 实例上的 toJson() 方法,传入一个名为 response 的对象作为参数。 toJson()
方法负责将传入的对象序列化成 JSON 格式的字符串。这意味着它会遍历 response 对象的属性,并遵循 JSON的语法规则将其转换为一个文本字符串。如果有嵌套的对象、数组或其他复杂结构,这些也会被递归地转换为相应的 JSON 表示形式。

  1. System.out.println():

System.out.println() 是 Java 中的标准输出方法,用于将指定的字符串内容输出到控制台(Console),并在输出后换行。 在此上下文中,它接收由Gson().toJson(response) 返回的 JSON 字符串作为参数,并将其打印到控制台。这一步骤使得开发者能够直观地查看 response 对象经过 JSON 序列化后的文本表现,便于调试、记录日志或进行其他形式的数据交互。

4, 综上所述,这段代码的完整功能是:使用 Gson 库将一个名为 response 的对象序列化为 JSON 字符串,然后通过 System.out.println() 将这个 JSON 字符串输出到控制台,方便开发者查看和验证 response 对象的 JSON 表现形式。这样的操作常见于调试过程中,用于检查网络请求的响应数据、中间计算结果或其他需要以 JSON 形式展示的数据结构。

代码及运行结果展示

public class Student {private int age = 0;private  String name = "";private int classname = 0;public Student(int age, String name, int classname) {this.age = age;this.name = name;this.classname = classname;}
}
import com.google.gson.Gson;
public class Main {public static void main(String[] args) {Student student = new Student(18, "wang", 100);System.out.println(new Gson().toJson(student));}
}

运行结果:
在这里插入图片描述
可以看到,student对象已经被转换成json格式的字符串。
但是有个问题,就是这个字符串并没有以json的格式进行输出

格式化json字符串

格式化字符串也只需要一行代码就可以解决
主要使用到的是GsonBuilder()的setPrettyPrinting()

  System.out.println(new GsonBuilder().setPrettyPrinting().create().toJson(student));

这段代码使用 Gson 库将一个名为 student 的对象转换为格式化的 JSON 字符串,并将其输出到控制台。下面逐行解释:

System.out.println(new GsonBuilder().setPrettyPrinting().create().toJson(student));

new GsonBuilder(): 创建一个 GsonBuilder 实例。GsonBuilder 是 Gson 库提供的一个用于定制 Gson 实例的构造器类。通过它,您可以设置各种序列化和反序列化选项,如日期格式、字段过滤规则、是否启用/禁用特定功能等。

.setPrettyPrinting(): 调用 GsonBuilder 实例的 setPrettyPrinting() 方法。这个方法告诉 Gson 在序列化时启用美观(pretty)打印模式,即将生成的 JSON 字符串格式化为易于阅读的形式,包含适当的缩进和换行。这对于调试和日志输出非常有用。

.create(): 调用 GsonBuilder 实例的 create() 方法。这个方法基于之前设置的各项选项创建一个新的 Gson 实例。Gson 是 Gson 库的核心类,提供了序列化(toJson)和反序列化(fromJson)的功能。

.toJson(student): 调用新创建的 Gson 实例的 toJson() 方法,传入参数 student。这个方法负责将传入的对象(在这里是 student)转换为 JSON 字符串。Gson 会根据 student 类型的结构和属性,将其序列化为符合 JSON 格式的文本。

System.out.println(...): 最后,将 toJson() 方法返回的格式化 JSON 字符串传递给 System.out.println(),这是一个标准的 Java 输出函数,将字符串内容打印到控制台,并在末尾添加一个换行符。

综上所述,这段代码的作用是:使用 Gson 库的 GsonBuilder 创建一个开启了美观打印模式的 Gson 实例,然后使用这个实例将 student 对象序列化为格式化的 JSON 字符串,并最终将该 JSON 字符串输出到控制台。这样做的目的是以易于阅读的格式显示 student 对象的 JSON 表示。

代码及运行结果展示

在这里插入图片描述
可以看到,student最终以格式化后的json字符串输出

从json字符串中截取字段

需求: 从以上json字符串中截取出特定字段和其值

需要三步:

  1. 将json字符串解析为json对象
  2. 获取特定字段的值
  3. 将JsonElement(第二步获取到的值)转换为所需的数据类型

将json字符串解析为json对象

        String s = new GsonBuilder().setPrettyPrinting().create().toJson(student);JsonObject jsonObject = new Gson().fromJson(s, JsonObject.class);

获取特定字段的值

这里需要确保jsonObject不为空,以及key值在json字符串中存在

        JsonElement age = jsonObject.get("age");

将JsonElement(第二步获取到的值)转换为所需的数据类型

针对不同类型的value,做不同处理:

       if (age != null && !age.isJsonNull()) {if (age.isJsonPrimitive() && age.getAsJsonPrimitive().isString()) {// 处理字符串值的情况String value = age.getAsString();System.out.println(value);} else if(age.isJsonPrimitive() && age.getAsJsonPrimitive().isNumber()){//处理数字的情况int value = age.getAsInt();System.out.println(value);}// 处理其他类型值的情况,比如、布尔值或 JSON 对象} else {// 处理字段不存在或值为 null 的情况}

如果字段的值是一个数字,可以调用 getAsInt()、getAsLong()、getAsFloat() 或 getAsDouble() 方法将其转换为相应的数值类型。

if (fieldValue.isJsonPrimitive() &amp;&amp; fieldValue.getAsJsonPrimitive().isNumber()) {int intValue = fieldValue.getAsInt();// 处理整数值的情况
}

如果字段的值是一个布尔值,可以调用 getAsBoolean() 方法将其转换为布尔类型。

if (fieldValue.isJsonPrimitive() &amp;&amp; fieldValue.getAsJsonPrimitive().isBoolean()) {boolean booleanValue = fieldValue.getAsBoolean();// 处理布尔值的情况
}

如果字段的值是一个 JSON 对象,可以调用 getAsJsonObject() 方法将其转换为一个新的 JSON 对象,然后对其进行进一步处理。

if (fieldValue.isJsonObject()) {JsonObject nestedObject = fieldValue.getAsJsonObject();// 处理嵌套 JSON 对象的情况
}

这些方法可以根据字段值的类型进行适当的转换和处理,确保的代码在不同类型的字段值情况下都能正常运行。

代码及运行结果展示

在这里插入图片描述

Game over!!!

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

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

相关文章

go语言学习--3.常用语句

目录 1.条件语句 1.1 if语句 1.2 if-else语句 1.3 switch语句 1.4 select语句 2.循环语句 2.1循环处理语句 2.2循环控制语句 3.go语言关键字 1.条件语句 和c语言类似&#xff0c;相关的条件语句如下表所示&#xff1a; 1.1 if语句 if 布尔表达式 {/* 在布尔表达式为 t…

小红的白色字符串

题目描述 小红拿到了一个字符串&#xff0c;她准备将一些字母变成白色&#xff0c;变成白色的字母看上去就和空格一样&#xff0c;这样字符串就变成了一些单词。 现在小红希望&#xff0c;每个单词都满足以下两种情况中的一种&#xff1a; 1.开头第一个大写&#xff0c;其余为…

echarts折线图自定义打点标记小工具

由于没研究明白echarts怎么用label和lableLine实现自定义打点标记&#xff0c;索性用markPoint把长方形压扁成线模拟了一番自定义打点标记&#xff0c;记录下来备用。&#xff08;markLine同理也能实现&#xff09; 实现代码如下&#xff1a; <!DOCTYPE html> <html…

C#基础--之数据类型

C#基础–之数据类型 在第一章我们了解了C#的输入、输出语句后&#xff0c;我这一节主要是介绍C#的基础知识&#xff0c;本节的内容也是后续章节的基础&#xff0c;好的开端等于成功的一半。在你阅读完本章后&#xff0c;你就有足够的C#知识编写简单的程序了。但还不能使用封装、…

电视盒子哪个好?2024口碑网络电视盒子排行榜

多年来电视盒子始终占据重要地位&#xff0c;功能上并没有受到影响。在这么多品牌中哪些电视盒子的评价是最好的呢&#xff1f;小编根据各大电商平台的用户评价情况整理了口碑最好的网络电视盒子排行榜&#xff0c;跟着小编一起看看市面上的电视盒子哪个好吧。 TOP 1&#xff1…

OpenHarmony 资源调度之内存管理源码分析

作者&#xff1a;张守忠 1 内存管理简介 内存管理部件位于全局资源调度管控子系统中&#xff0c;基于应用的生命周期状态&#xff0c;更新进程回收优先级列表&#xff0c;通过内存回收、查杀等手段管理系统内存&#xff0c;保障内存供给。 1.1 内存管理框架 内存管理部件主要…

通过IPV6+DDNS实现路由器远程管理和Win远程桌面控制

前期需要的准备&#xff1a; 软路由&#xff0c;什么系统都可以&#xff0c;要支持IPV6&#xff0c;能够自动添加解析 光猫的管理员账号&#xff0c;能够进入光猫修改配置&#xff0c;拨号上网账号 域名账号和DNS服务 主要步骤&#xff1a; 利用管理员账号&#xff0c;进入…

外贸开发信必知技巧:高回复率不再是梦

外贸行业在Zoho的客户群体中占比较高。因为我们的国际化背景、丰富的产品组合、多语言多币种跨时区、高性价比等特点&#xff0c;成为外贸企业开展业务的选择。在和外贸客户沟通中&#xff0c;发现无论是外贸大拿还是新手小白&#xff0c;大家遇到一个共同的问题——发出去的开…

深入浅出dhcpcd:Linux环境下的动态主机配置协议客户端

在现代网络环境中&#xff0c;自动获取IP地址和网络配置已成为基本需求。动态主机配置协议&#xff08;DHCP&#xff09;在简化网络配置方面发挥了关键作用&#xff0c;它允许设备自动从网络服务器获取IP地址和其他网络配置信息。Linux系统中的dhcpcd&#xff08;Dynamic Host …

抖音上阳哥的视频号带货推荐靠谱吗?

在抖音这个短视频平台的广阔天地里&#xff0c;阳哥以其独到的眼光和精准的推荐&#xff0c;成为了众多粉丝心中的带货指南。不同于一些网红直接进行视频号带货&#xff0c;阳哥更多地是以一个推荐人的身份出现&#xff0c;为粉丝们筛选并推荐优质的带货内容。那么&#xff0c;…

python——列表(list)

概念 列表一般使用在一次性存储多个数据 语法 lst[数据1&#xff0c;数据2&#xff0c;.....]方法 #mermaid-svg-flVxgVdpSqFaZyrF {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-flVxgVdpSqFaZyrF .error-icon{…

每日一题:找到冠军I

一场比赛中共有 n 支队伍&#xff0c;按从 0 到 n - 1 编号。 给你一个下标从 0 开始、大小为 n * n 的二维布尔矩阵 grid 。对于满足 0 < i, j < n - 1 且 i ! j 的所有 i, j &#xff1a;如果 grid[i][j] 1&#xff0c;那么 i 队比 j 队 强 &#xff1b;否则&#x…

图像版PDF文件OCR识别转换为文本的3款免费工具软件

图像版PDF文件里面都是图片&#xff0c;要先通过OCR技术识别出文本&#xff0c;然后才能进行进一步处理编辑。下面是3个免费的PDF文件OCR识别软件工具&#xff1a; ●简可信PDF批量识别工具 简可信PDF批量识别工具是一款专门用于将PDF文件进行批量OCR&#xff08;光学字符识别…

针对“AI+医疗”的可行方案

针对“AI+医疗”的可行方案如下: 一、方案目标 利用AI技术,结合医疗数据,开发一套高效、准确的医疗辅助系统,旨在提高医疗诊断的精度、加速药物研发进程、优化疾病预测模型,从而辅助医生进行疾病诊断和治疗方案制定。 二、方案内容 医疗数据整合与预处理 收集各类医疗数…

ObjectiveC-第一部分-基础入门-学习导航

专题地址:MacOS一站式程序开发系列专题 第一部分:基础入门学习导航 OSX-01-Mac OS应用开发概述:简单介绍下MacOS生态、Xcode使用以及使用Xcode创建app的方法OSX-02-Mac OS应用开发系列课程大纲和章节内容设计:介绍下此系列专题的文章内容组织形式以及此系列专题的覆盖内容…

【QT教程】QT6 Web应用实战

QT6 Web应用实战 使用AI技术辅助生成 QT界面美化视频课程 QT性能优化视频课程 QT原理与源码分析视频课程 QT QML C扩展开发视频课程 免费QT视频课程 您可以看免费1000个QT技术视频 免费QT视频课程 QT统计图和QT数据可视化视频免费看 免费QT视频课程 QT性能优化视频免费看 免费…

二叉树,非递归的深度遍历

#include<iostream> using namespace std; #define MAXSIZE 500 typedef struct tree{char data;struct tree *lchild;struct tree *rchild;}tree,*Tree;//非递归算法的深度遍历 //不利用系统的递归栈&#xff0c;自己自定义栈&#xff0c;用来实现先序遍历 //先将右孩子…

虚假贸易防控:国资委74号文解读,技术人员如何建防?

官.网地址&#xff1a;合合TextIn - 合合信息旗下OCR云服务产品 2023年12月&#xff0c;国资委发布《关于规范中央企业贸易管理严禁各类虚假贸易的通知》&#xff08;国资发财评规[2023]74号&#xff09;&#xff0c;提出“十不准”&#xff0c;严禁央企开展各类虚假贸易业务…

斐波那契数列经典应用之兔子繁殖问题

问题描述 此处有一题&#xff1a;有一对小兔子&#xff0c;从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。按此规律&#xff0c;假设没有兔子死亡&#xff0c;第一个月有一对刚出生的小兔子&#xff0c;问第n个月有多少对兔子&#xff1f; 分析…