Java 中Json中既有对象又有数组的参数 如何转化成对象

news/2024/7/7 14:25:51/文章来源:https://www.cnblogs.com/TS86/p/18284541

1.示例一:解析一个既包含对象又包含数组的JSON字符串,并将其转换为Java对象

在Java中处理JSON数据,尤其是当JSON结构中既包含对象又包含数组时,常用的库有org.jsonGsonJackson。这里我将以Gson为例来展示如何解析一个既包含对象又包含数组的JSON字符串,并将其转换为Java对象。

首先,确保我们的项目中已经加入了Gson库的依赖。如果我们使用的是Maven,可以在pom.xml中添加如下依赖:

<dependency>  <groupId>com.google.code.gson</groupId>  <artifactId>gson</artifactId>  <version>2.8.9</version> <!-- 请检查是否有更新版本 -->  
</dependency>

接下来,我们定义一些Java类来映射JSON数据。假设我们有如下的JSON结构:

{  "name": "Example",  "age": 30,  "hobbies": [  "Reading",  "Traveling",  "Coding"  ]  
}

我们需要定义一个类Person来表示这个JSON对象:

public class Person {  private String name;  private int age;  private List<String> hobbies;  // 构造方法、getter和setter省略,为了简洁  public Person() {  }  public String getName() {  return name;  }  public void setName(String name) {  this.name = name;  }  public int getAge() {  return age;  }  public void setAge(int age) {  this.age = age;  }  public List<String> getHobbies() {  return hobbies;  }  public void setHobbies(List<String> hobbies) {  this.hobbies = hobbies;  }  @Override  public String toString() {  return "Person{" +  "name='" + name + '\'' +  ", age=" + age +  ", hobbies=" + hobbies +  '}';  }  
}

最后,我们使用Gson库来解析JSON字符串并转换为Person对象:

import com.google.gson.Gson;  public class JsonDemo {  public static void main(String[] args) {  String json = "{\"name\":\"Example\",\"age\":30,\"hobbies\":[\"Reading\",\"Traveling\",\"Coding\"]}";  Gson gson = new Gson();  Person person = gson.fromJson(json, Person.class);  System.out.println(person);  }  
}

以上代码中,Gson类被用于解析JSON字符串并将其转换成Person类的实例。fromJson方法接受两个参数:JSON字符串和要转换成的目标类的Class对象。执行上述代码,我们将看到控制台输出了Person对象的字符串表示,其中包括了从JSON中解析出的nameagehobbies

这个示例展示了如何在Java中使用Gson库处理包含对象和数组的复杂JSON结构,并将其转换为Java对象。在实际应用中,我们可以根据JSON结构定义相应的Java类,并使用Gson库来轻松地实现JSON与Java对象之间的转换。

2.示例二:使用Gson库来解析一个包含对象和数组的JSON字符串

当然,我可以提供一个更详细的解决方案,包括完整的类定义、主类中的逻辑处理,以及如何运行整个程序。这里我们仍然使用Gson库来解析一个包含对象和数组的JSON字符串。

首先,确保我们的项目中已经添加了Gson库的依赖(如之前的Maven依赖示例所示)。

然后,我们定义Person类,这个类将映射JSON中的对象部分。对于数组部分,我们直接使用Java的List<String>来接收。

2.1 Person.java

import java.util.List;  public class Person {  private String name;  private int age;  private List<String> hobbies;  // 构造方法(可选)  public Person() {  }  // Getter 和 Setter  public String getName() {  return name;  }  public void setName(String name) {  this.name = name;  }  public int getAge() {  return age;  }  public void setAge(int age) {  this.age = age;  }  public List<String> getHobbies() {  return hobbies;  }  public void setHobbies(List<String> hobbies) {  this.hobbies = hobbies;  }  // toString 方法,用于打印Person对象的信息  @Override  public String toString() {  return "Person{" +  "name='" + name + '\'' +  ", age=" + age +  ", hobbies=" + hobbies +  '}';  }  
}

2.2 JsonDemo.java

接下来是主类,我们将在这个类中创建JSON字符串,并使用Gson库将其解析为Person对象。

import com.google.gson.Gson;  public class JsonDemo {  public static void main(String[] args) {  // JSON 字符串  String json = "{\"name\":\"John Doe\",\"age\":30,\"hobbies\":[\"Reading\",\"Traveling\",\"Coding\"]}";  // 创建 Gson 实例  Gson gson = new Gson();  // 使用 Gson 的 fromJson 方法将 JSON 字符串解析为 Person 对象  Person person = gson.fromJson(json, Person.class);  // 打印 Person 对象  System.out.println(person);  }  
}

2.3 如何运行程序

(1)确保Gson库已添加到我们的项目中:如果我们使用的是IDE(如IntelliJ IDEA、Eclipse等),我们可以通过Maven或Gradle来添加依赖,或者将Gson的jar文件直接添加到我们的项目库中。

(2)编译和运行

  • 如果我们使用的是命令行,可以使用javac命令来编译Person.javaJsonDemo.java,然后使用java命令来运行JsonDemo类。
  • 如果我们使用的是IDE,我们可以直接右键点击JsonDemo.java并选择“Run 'JsonDemo.main()'”来运行程序。

(3)查看结果:运行程序后,我们将在控制台看到Person对象的输出,它包含了从JSON字符串中解析出的nameagehobbies

这个解决方案展示了如何在Java中使用Gson库来处理包含对象和数组的JSON数据,并将其转换为Java对象。我们可以根据自己的需求修改Person类和JSON字符串。

3. Gson库简介

Gson库是一个广泛使用的Java序列化/反序列化库,它能够将Java对象转换成JSON格式的字符串,也能将JSON字符串解析成Java对象。以下是关于Gson库的详细信息:

3.1概述

(1)定义与用途

  • Gson库是Google开发的一个Java库,用于在Java对象和JSON表示之间进行转换。
  • 它允许开发者轻松地将Java对象序列化为JSON字符串,以及将JSON字符串反序列化为Java对象。

(2)官方描述

  • Gson官方描述其为“A Java serialization/deserialization library to convert Java Objects into JSON and back”。

3.2功能与特点

(1)易于使用

  • Gson提供了简单直观的方法来转换Java对象和JSON,如toJson()fromJson()
  • 它支持任意复杂的Java对象,包括预先存在的、没有源代码的对象。

(2)自定义序列化与反序列化

  • Gson允许开发者为特定类型的对象定义自定义的序列化器和反序列化器。
  • 这使得开发者能够控制对象到JSON的映射方式,以及从JSON到对象的解析方式。

(3)性能与可扩展性

  • Gson在性能上表现良好,能够处理大量的数据。
  • 它支持序列化/反序列化大型集合和复杂对象结构。

(4)内置类型支持

  • Gson内置了对Java基本类型、集合类型、泛型等的支持。
  • 它能够自动处理这些类型的序列化与反序列化。

(5)字段排除与版本控制

  • Gson支持在序列化时排除特定的字段。
  • 它还提供了版本控制功能,允许开发者在JSON结构中添加版本信息。

3.3 使用场景

  • Gson库广泛用于Web开发、移动应用开发等领域,特别是在需要处理JSON数据的场景中。
  • 它可以与Android开发结合使用,是Android开发中处理JSON数据的常用库之一。

3.4 如何使用Gson

(1) 引入Gson库

  • 可以通过Maven、Gradle等构建工具将Gson库添加到项目中。
  • 也可以下载Gson的jar包并手动添加到项目的类路径中。

(2)序列化Java对象到JSON

  • 使用Gson对象的toJson()方法,将Java对象作为参数传入,即可得到对应的JSON字符串。

(3)反序列化JSON到Java对象

  • 使用Gson对象的fromJson()方法,传入JSON字符串和要转换成的Java对象的类型(类名.class),即可得到对应的Java对象。

3.5 示例代码

以下是一个简单的示例,展示了如何使用Gson库将Java对象序列化为JSON字符串,并将JSON字符串反序列化为Java对象:

import com.google.gson.Gson;  public class GsonExample {  public static void main(String[] args) {  // 创建一个Person对象  Person person = new Person("John Doe", 30);  // 创建Gson对象  Gson gson = new Gson();  // 将Person对象序列化为JSON字符串  String json = gson.toJson(person);  System.out.println(json); // 输出: {"name":"John Doe","age":30}  // 将JSON字符串反序列化为Person对象  Person personFromJson = gson.fromJson(json, Person.class);  System.out.println(personFromJson.getName()); // 输出: John Doe  System.out.println(personFromJson.getAge()); // 输出: 30  }  // 假设的Person类  static class Person {  private String name;  private int age;  // 构造方法、getter和setter省略  }  
}

3.6 总结

Gson库是一个功能强大、易于使用的Java序列化/反序列化库,它提供了丰富的API来支持Java对象和JSON之间的转换。无论是在Web开发还是移动应用开发领域,Gson都是处理JSON数据的理想选择。

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

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

相关文章

mirai Bot初始化配置

RT其实本来我的bot已经因为自己手贱登陆qq nt直接报废了,但是论坛里有佬提供了新的协议库,那这不赶紧复活bot都对不起这个新的协议库。 本文写于2024年7月4日19:20:21,可能随着时间久远而无法实现功能。由于存在下载障碍,所以这里也搞了个存档,本帖中的相关标星*资源无法下…

量化曲线的平滑程度

思路 1. 对原始数据一阶求导,得到一阶导数数组。 2. 对一阶导数数组求标准差。导数的标准差提供了导数值的波动性,标准差越小,曲线越平滑。 平滑曲线import numpy as np import matplotlib.pyplot as plt from matplotlib import font_manager fname="/usr/local/pytho…

Android常见错误

错误1 A problem occurred configuring root project ����ʶ��. > Could not resolve all files for configuration :classpath.> Could not resolve com.android.tools.build:gradle:8.4.0.Required by:project : > com.android.application:com.android.appli…

MyBatis中的Where标签:提升你的SQL查询效率

哈喽,大家好,我是木头左!理解MyBatis的Where标签 MyBatis是一款优秀的持久层框架,它提供了许多强大的标签来帮助编写更优雅、高效的SQL语句。其中,<where>标签是使用频率极高的一个,它能够自动处理查询条件,使得的SQL语句更加简洁和高效。在这篇文章中,将深入探讨…

Java中的JSON神器,如何轻松玩转复杂数据结构

哈喽,大家好,我是木头左!一、揭秘JSON世界的基石 在Java的世界中,JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它基于文本,易于阅读和编写,同时也易于机器解析和生成。JSON在日常开发中的应用非常广泛,无论是前后端的数据交互,还是配置文件的读取,…

《Python 第三方模块包安装指南》

在 Python 编程中,第三方模块包极大地丰富了其功能,让我们能够更高效地完成各种任务。下面将为您详细介绍如何安装 Python 的第三方模块包。 一、使用 pip 命令安装 pip 是 Python 的包管理工具,大多数情况下,我们可以通过以下命令来安装第三方模块包:pip install 模块包名…

巴图自动化Modbus转PN网关模块连智能仪表与PLC通讯

通过巴图自动化Modbus转Profinet协议网关模块,实现PLC对仪表设备的远程监控和数据传输,提高生产效率和运行稳定性。巴图自动化Modbus转Profinet协议转换BT-MDPN100网关模块的主要功能是实现Modbus协议和Profinet协议之间的转换和通信。Modbus 转 Profinet协议网关模块集成了M…

一文搞懂到底什么是 AQS

日常开发中,我们经常使用锁或者其他同步器来控制并发,那么它们的基础框架是什么呢?如何实现的同步功能呢?本文将详细用白话讲解构建锁和同步器的基础框架--AQS,并根据源码分析其原理。前言 日常开发中,我们经常使用锁或者其他同步器来控制并发,那么它们的基础框架是什么…

flutter状态管理 provider使用

provider是flutter官方推荐的状态管理插件,是基于InheritedWidget实现的。 下面我们来讲一个provider的使用方法。 1.在pubspec.yaml文件中添加 provider: ^6.1.2 开发文档:https://pub-web.flutter-io.cn/packages/provider 可以查看使用方法和最新版本号。 添加完成后…

企业数字化转型:顶层规划方法

随着数字化时代的到来,发生了以数字化、智能化为典型特征的新一轮科技革命,各行各业利用互联网、大数据、云计算、人工智能、区块链技术对传统产业进行全方位、全链条改造,实施“上云用数赋智”行动,全面推进各行业数字化转型。数字经济的大门已然开启,数字经济顶层战略规…

Nuxt3 的生命周期和钩子函数(十)

摘要:本文详细介绍了Nuxt3框架中的五个webpack钩子函数:webpack:configResolved用于在webpack配置解析后读取和修改配置;webpack:compile在编译开始前调用,可修改编译选项;webpack:compiled在编译完成后调用,可处理编译结果;webpack:change在开发模式下文件变化时触发,…

Jenkins汉化

1、Jenkins版本:版本2.426.3) Manage Jenkins->选择Plugins->切换到Availabled plugin->搜索local,然后选中安装,如下图所示 2、安装完成后重启Jenkins,汉化完成。如下图所示 像个小学生一样努力学习

模拟集成电路设计系列博客——9.1 比较器

模拟集成电路设计 9.1 比较器 比较器可能是继放大器之后第二常用的电路元件,比较器用于判断一个信号是否大于或小于零,或者比较一个信号是否大于另一个。如我们之前的章节所见,比较器在ADC中非常常用。在其他的应用中也经常出现比较器,例如数据传输,开关电源稳压器等等。 …

prufer序列

prufer序列用途: 将带标号的树用唯一的整数序列表示出来,证明凯莱公式。构造方法:每次选择一个编号最小的叶结点并删掉它,然后在序列中记录下它连接到的那个结点。重复\(n-2\)次后就只剩下两个结点,算法结束。 举个栗子(本图来自baoziwu2,侵删)显然可以有一个用堆做的方法,…

【冷启动#2】实用的springboot tutorial入门demo

跟着官方文档熟悉一遍创建spring工程的步骤 https://spring.io/guides/gs/spring-boot https://juejin.cn/post/7077958723829760008 demo简介 整个demo的预期目标是: 管理一堆玩家的数据,数据库使用的是现成的我们虚拟机上安装的MySQL 项目结构参考 主要工作:创建并熟悉spr…

CentOS8部署zerotier异地组网

本文介绍了在CentOS 8系统上部署ZeroTier以实现异地组网的方法,包括安装、配置、加入网络、开启IP转发和设置路由表等步骤,并提出进一步实现公网无缝组网的展望。CentOS8部署zerotier异地组网 CentOS8部署zerotier异地组网 一、前言 本文在此前研究部署FRP进行内网穿透,但FR…

《DNK210使用指南 -CanMV版 V1.0》第九章 打印输出实验

第九章 打印输出实验 1)实验平台:正点原子DNK210开发板 2)章节摘自【正点原子】DNK210使用指南 - CanMV版 V1.0 3)购买链接:https://detail.tmall.com/item.htm?&id=782801398750 4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/k210/ATK-DN…

分享一款可编辑本地电脑文件的在线编辑器

之前见过在线版的VSCode,被惊讶到了。网页上竟然可以编辑电脑本地的文件,打破了网页无法编辑本地电脑文件的限制。一直好奇怎么做的。抽空研究了一下,然后发现其实也不难。背景 之前见过在线版的VSCode,被惊讶到了。网页上竟然可以编辑电脑本地的文件,打破了网页无法编辑本…

xhcms

xhcms 目录结构 admin --管理后台文件夹 css --存放css的文件夹 files --存放页面的文件夹 images --存放图片的文件夹 inc --存放网站配置文件的文件夹 install --网站进行安装的文件夹 seacmseditor --编辑器文件夹 templ…

lrzsz安装完成后rz乱码

rz选择文件夹后乱码传输不到linux里面, 这时候只需要rz -be再选择文件 这样就可以进行后续的解压了tar -zxvf jdk-8u65-linux-x64.tar.gz