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

news2024/11/27 1:43:01

小王学习录

  • 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,做不同处理:
age.isJsonNull: 判断key存在,但是value为空的情况
age.isJsonPrimitive(): 用于检查 JSON 元素是否表示一个 JSON 基本类型。JSON 基本类型包括字符串、数字、布尔值和 null。当 age 是一个 JSON 基本类型时,age.isJsonPrimitive() 返回 true;否则,返回 false。age.isJsonPrimitive() 这一部分用于检查 age 字段的值是否为 JSON 基本类型。如果 age 字段的值是一个 JSON 基本类型,那么就可以进一步检查它的具体类型,比如字符串、数字等。

       if (age != null && !age.isJsonNull()) {
       //age.isJsonNull 判断key存在,但是value为空的情况
            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);
            } else if{
            	 // 处理其他类型值的情况,比如、布尔值或 JSON 对象
            } else if(value.isJsonArray){
            // 处理json元素是json数组的情况
            	return value.getAsJsonArray();
            } else if(!value.isJsonPrimitive()){
            // 处理json元素还是json的问题
                JsonObject jsonObject1 = value.getAsJsonObject();
                return jsonObject1;
            }
        } 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.coloradmin.cn/o/1590775.html

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

相关文章

Meta推出全新定制AI芯片,加速追赶对手的步伐

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Nginx讲解 很详细了!!!

hello&#xff0c;你好鸭&#xff0c;我是Ethan&#xff0c;很高兴你能来阅读&#xff0c;昵称是希望自己能不断精进&#xff0c;向着优秀程序员前行!&#x1f4aa;&#x1f4aa;&#x1f4aa; 目前博客主要更新Java系列、数据库、项目案例、计算机基础等知识点。感谢你的阅读和…

有图片转成PDF文件格式的方法吗?分享图片转成PDF文件的方法

将图片转换为PDF文件是一个相对简单的过程&#xff0c;但也需要一定的步骤和注意事项。下面&#xff0c;我将详细介绍如何将图片转换为PDF文件&#xff0c;包括所需的工具、步骤以及可能遇到的问题和解决方案。 首先&#xff0c;我们需要一个能够将图片转换为PDF文件的工具。市…

C语言进阶课程学习记录-数组指针和指针数组分析

C语言进阶课程学习记录-数组指针和指针数组分析 实验-数组指针的大小实验-指针数组小结 本文学习自狄泰软件学院 唐佐林老师的 C语言进阶课程&#xff0c;图片全部来源于课程PPT&#xff0c;仅用于个人学习记录 实验-数组指针的大小 #include <stdio.h>typedef int(AINT…

ABAP-CPI-Odata POST-create_deep_entity 多层嵌套的处理及CPI端的调用

该文章演示怎么在OData里,创建一个多套多的请求结构,传入数据处理后,返回多层级的处理结果;以及如何在CPI里写groovy脚本,去解析它;最后如何用postman模拟外围系统,调用CPI这个接口,从而去调用Odata接口 假如想用SAP Odata去实现传入多层级的数据,进行创建或者根据传入…

【网站项目】摄影竞赛小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

【c++】优先级队列|反向迭代器(vector|list)

优先级队列的常用函数的使用 #include<iostream> #include<queue> using namespace std;int main() {priority_queue<int>st;st.push(1);st.push(7);st.push(5);st.push(2);st.push(3);st.push(9);while (!st.empty()){cout << st.top() << &qu…

安达发|APS计划排程系统做出详细生产作业计划需要哪些条件

在制造行业中&#xff0c;APS&#xff08;高级计划排程系统&#xff09;是核心的信息系统之一&#xff0c;它负责制定详细的生产作业计划以确保生产效率和交货期的准确性。要做出有效的详细生产作业计划&#xff0c;需要满足一系列条件要求&#xff0c;以下是一些关键因素&…

FME学习之旅---day24

我们付出一些成本&#xff0c;时间的或者其他&#xff0c;最终总能收获一些什么。 高级地理数据库 教程&#xff1a;地理数据库转换 上述教程包括 如何使用 Esri 模板地理数据库 该内容在FME学习之旅day19 已经学习过 使用地理数据库属性域&#xff1a;编写编码属性域 属…

css里面的浮动笔记

参考链接&#xff1a; (图文详细)最通俗易懂的CSS 浮动float属性详解_css float简单理解-CSDN博客 经验分享&#xff1a;CSS浮动(float,clear)通俗讲解 - 杨元 - 博客园 (cnblogs.com) 要点&#xff1a; 浮动元素只会影响后面标准流的元素 &#xff0c;如果在它之前有一个标…

Harmony鸿蒙南向驱动开发-RTC接口使用

功能简介 RTC&#xff08;real-time clock&#xff09;为操作系统中的实时时钟设备&#xff0c;为操作系统提供精准的实时时间和定时报警功能。当设备下电后&#xff0c;通过外置电池供电&#xff0c;RTC继续记录操作系统时间&#xff1b;设备上电后&#xff0c;RTC提供实时时…

python实战-含容器运用

目录 1.找出10000以内能被5或6整除&#xff0c;但不能被两者同时整除的数 2.写一个方法&#xff0c;计算列表所有偶数下标元素的和(注意返回值) 3.根据完整的路径从路径中分离文件路径、文件名及扩展名 4.根据标点符号对字符串进行分行 5.去掉字符串数组中每个字符串的空格…

基于springboot+vue实现的计算机等级考试报名系统

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;spring…

第七周周一人工智能导论预告

第一讲 人工智能概述 1.1 简介 1.2人工智能的概念 1.3 人工智能的发展简史 1.4 人工智能研究的基本内容 第一讲 人工智能概述单元测试 第二讲 一阶谓词逻辑表示法 2.1 命题逻辑 2.2 谓词逻辑 2.3 一阶谓词逻辑知识表示法 第二讲 一阶谓词逻辑知识表示法单元测试 第…

Docker 学习笔记(六):挑战容器数据卷技术一文通,实战多个 MySQL 数据同步,能懂会用,初学必备

一、前言 记录时间 [2024-4-11] 系列文章简摘&#xff1a; Docker学习笔记&#xff08;二&#xff09;&#xff1a;在Linux中部署Docker&#xff08;Centos7下安装docker、环境配置&#xff0c;以及镜像简单使用&#xff09; Docker 学习笔记&#xff08;三&#xff09;&#x…

基于STM32F103单片机的时间同步项目

一、前言 本项目为前一个时间同步项目的更迭版本&#xff0c;由于之前的G031开发板没有外部晶振&#xff0c;从机守时能力几乎没有&#xff0c;5秒以上不同步从机时间就开始飞了。在考虑成本选型后&#xff0c;选择了带有外部有缘晶振的STM32F103C8T6最小单片机&#xff0c;来作…

itext7 pdf转图片

https://github.com/thombrink/itext7.pdfimage 新建asp.net core8项目&#xff0c;安装itext7和system.drawing.common 引入itext.pdfimage核心代码 imageListener下有一段不安全的代码 unsafe{for (int y 0; y < image.Height; y){byte* ptrMask (byte*)bitsMask.Scan…

一些炫酷的按钮特效

一些炫酷的按钮特效 效果展示 完整vue版代码 <template><div class"test"><div><button class"custom-btn btn-1">btn-1</button><button class"custom-btn btn-2">btn-2</button><button class…

【安全】挖矿木马自助清理手册

一、什么是挖矿木马 挖矿木马会占用CPU进行超频运算&#xff0c;从而占用主机大量的CPU资源&#xff0c;严重影响服务器上的其他应用的正常运行。黑客为了得到更多的算力资源&#xff0c;一般都会对全网进行无差别扫描&#xff0c;同时利用SSH爆破和漏洞利用等手段攻击主机。 …

更换淘宝镜像地址,旧的已经失效(https://registry.npm.taobao.org )

旧的镜像地址&#xff1a;npm install --registryhttps://registry.npm.taobao.org 新的镜像地址&#xff1a;npm install --registryhttps://registry.npmmirror.com