Json与Java类

简介

        JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。JSON数据由键值对构成,并以易于阅读的文本形式展现,支持数组、对象、字符串、数字、布尔值和null等数据类型。在Web开发、移动应用以及服务器间的数据交换中,JSON格式的应用极为广泛。

        Java类则是面向对象编程语言Java中用于定义对象蓝图的结构,它定义了对象的状态(即成员变量)和行为(即方法)。Java类可以用来创建具有特定属性和功能的对象实例,是面向对象编程的基础构建模块。

        当处理JSON数据与Java应用交互时,通常需要将JSON数据转换为Java对象,或反之将Java对象序列化为JSON字符串。这样做可以方便地在Java代码中操作和处理数据,同时保持与Web服务和其他系统间的兼容性。

一、JSON 结构

这个Java类结构如果要转换成JSON格式,其数据结构大致如下:

{"date": "2023-04-01","cityInfo": {"city": "New York"}
}
  • date 键对应了 MyJson 类中的 date 字段,存储日期字符串。
  • cityInfo 是一个对象,对应了 MyJson 类中的 CityInfo 内部类实例,其中:
    • city 键则对应了 CityInfo 类中的 city 字段,存储城市名称。

二、Java 类结构解释

将JSON字符串转换回Java对象(反序列化):

public class MyJson {// 定义一个私有字段,用于存储日期信息private String date;// 定义一个内部类,表示城市信息private CityInfo cityInfo;// 获取日期的方法public String getDate() {return date;}// 获取城市信息的方法public CityInfo getCityInfo() {return cityInfo;}// 内部类 CityInfo,用来封装城市信息private class CityInfo {// 城市名称的私有字段private String city;// 获取城市名称的方法public String getCity() {return city;}}
}

        在实际开发中,如果您需要将这样的Java对象转换为JSON字符串(序列化)或者将JSON字符串转换回Java对象(反序列化),可以使用诸如 Gson、Jackson 等库来简化操作。例如,使用Gson库进行序列化和反序列化的基本代码示例如下:

三、序列化(Java对象转JSON)

MyJson myJson = new MyJson();
myJson.date = "2023-04-01";
myJson.cityInfo = new MyJson.CityInfo();
myJson.cityInfo.city = "New York";Gson gson = new Gson();
String json = gson.toJson(myJson);
// 创建一个MyJson对象实例
MyJson myJson = new MyJson();// 给MyJson对象的date字段赋值为"2023-04-01"
myJson.date = "2023-04-01";// 创建MyJson类内部类CityInfo的一个实例,并将其赋值给myJson的cityInfo字段
myJson.cityInfo = new MyJson.CityInfo();// 给刚创建的CityInfo对象的city字段赋值为"New York"
myJson.cityInfo.city = "New York";// 创建Gson对象,Gson是Google提供的一个用来在Java对象和JSON数据之间进行映射的库
Gson gson = new Gson();// 使用Gson对象的toJson方法,将myJson对象转换成其对应的JSON格式的字符串
// 这个过程称为序列化,即将Java对象转换为JSON字符串
String json = gson.toJson(myJson);

        这段代码首先创建了一个MyJson类的实例,并给其成员变量赋值,包括一个日期字符串和一个内部类CityInfo的实例,其中CityInfo也包含了一个城市名称的字段。之后,通过Google的Gson库,将这个填充了数据的MyJson对象转换成了JSON格式的字符串。这个过程是Java对象到JSON字符串的序列化过程,常用于数据传输或存储场景。

四、反序列化(JSON转Java对象)

String json = "{"date":"2023-04-01","cityInfo":{"city":"New York"}}";Gson gson = new Gson();
MyJson myJson = gson.fromJson(json, MyJson.class);
String json = "{\"date\":\"2023-04-01\",\"cityInfo\":{\"city\":\"New York\"}}";// 创建Gson对象,Gson是Google提供的一个Java库,用于将Java对象转换为JSON字符串或将JSON字符串转换为等价的Java对象
Gson gson = new Gson();// 使用Gson的fromJson方法,传入JSON字符串和目标Java类(MyJson.class)作为参数
// 该方法会解析JSON字符串,根据MyJson类的结构自动创建一个MyJson对象实例
// 其中,JSON字符串中的键值对会被映射到MyJson对象的相应字段上
// 例如,"date"键的值会被赋给MyJson对象的date属性,"cityInfo"内嵌对象的"city"键值对会被用来初始化MyJson对象内部的CityInfo对象
MyJson myJson = gson.fromJson(json, MyJson.class);

               在这段代码中,首先定义了一个JSON字符串json,它表示一个包含日期("date")和城市信息("cityInfo",其中包含"city")的简单数据结构。接下来,创建了Gson库的实例gson,用于处理JSON数据。最后,通过调用gson.fromJson()方法,将JSON字符串转换为了MyJson类的实例myJson。这一转换过程基于JSON键与Java对象字段名称的匹配,自动完成对象的创建与属性赋值。

五、static静态类

// 定义一个方法用于演示如何将Java对象转换为JSON字符串
private void JsonJava(){// 创建MyJson对象MyJson myJson = new MyJson();// 设置MyJson对象的数据字段myJson.data = "2024.6.22";// 创建并初始化MyJson的静态内部类CityInfo的实例,无需依赖MyJson的实例即可创建myJson.cityInfo = new MyJson.CityInfo();// 设置CityInfo的city字段myJson.cityInfo.city = "贵州";// 使用Gson库将MyJson对象转换为JSON字符串Gson gson = new Gson();String json = gson.toJson(myJson);// 将JSON字符串设置到TextView中显示textView2.setText(json);
}// 定义MyJson类,包含日期数据和城市信息的内部类
private static class MyJson{String data; // 存储日期信息// 静态内部类CityInfo,用于封装城市信息private static class CityInfo{String city; // 城市名称// 提供公开方法获取城市名称,尽管类本身是静态的,但方法访问控制仍可按需设定public String getCity() {return city;}}// CityInfo实例,由于静态内部类不依赖外部类实例,因此可以独立存在private CityInfo cityInfo;// 获取CityInfo实例的封装方法,虽然在这个例子中未直接使用,但展示了如何访问静态内部类实例private CityInfo getCityInfo() {return cityInfo;}// 获取日期数据的封装方法private String getData() {return data;}
}

        我们可以更清晰地看到静态内部类CityInfo是如何被创建和使用的,以及它作为MyJson类的一部分,是如何独立于外部类实例存在的。这样的设计有助于理解静态内部类在Java编程中的实际应用价值,特别是在处理JSON数据时,可以更加灵活地构建和操作数据模型。

在Java中,将内部类声明为static,即静态内部类,有以下几个主要的原因和效果:

  1. 访问权限: 静态内部类不需要依赖于外部类的实例就可以被创建和访问。这意味着你不需要先创建外部类的一个实例,就可以直接创建静态内部类的实例。在你的示例中,即使没有MyJson的实例,也可以直接创建CityInfo对象。

  2. 内存管理: 静态内部类不持有对外部类实例的引用。这减少了潜在的内存泄漏风险,因为即使外部类实例被垃圾回收,静态内部类及其实例仍然可以独立存在。

  3. 设计意图: 使用静态内部类通常表明这个类与外部类的实例关系不大,更多的是逻辑上的一种组织方式。它更像是一个辅助类或工具类,服务于外部类但不依赖于外部类的状态。

  4. 命名空间和封装: 将CityInfo作为MyJson的静态内部类,可以更好地组织代码,保持相关类的紧密性,同时利用外部类作为命名空间,避免类名冲突。

在你的代码片段中,MyJson类中的CityInfo类被声明为静态的,这样做的好处在于,当你使用Gson库来序列化或反序列化JSON时,可以直接创建和操作CityInfo对象,而无需先实例化MyJson。这简化了对象的创建过程,也使得代码更加清晰和高效。

六、非静态类

private void JsonJava(){// 创建MyJson实例MyJson myJson = new MyJson();// 设置MyJson的data字段myJson.data = "2024.6.22";// 创建MyJson的CityInfo实例,需通过MyJson的实例来创建MyJson.CityInfo cityInfo = myJson.new CityInfo();cityInfo.city = "贵州";// 将创建的CityInfo实例设置给MyJson的cityInfo字段myJson.setCityInfo(cityInfo);// 使用Gson库将MyJson对象转换为JSON字符串Gson gson = new Gson();String json = gson.toJson(myJson);// 将JSON字符串设置到textView2中textView2.setText(json);
}// 修改MyJson类,移除CityInfo的static修饰符
private class MyJson{String data;private CityInfo cityInfo;// 添加一个方法来设置cityInfo,因为非静态内部类实例需要通过外部类来创建和访问public void setCityInfo(CityInfo cityInfo) {this.cityInfo = cityInfo;}public CityInfo getCityInfo() {return cityInfo;}private String getData() {return data;}// 修改CityInfo为非静态内部类private class CityInfo{String city;public String getCity() {return city;}}
}

        在这个修改后的版本中,CityInfo不再声明为静态(去掉了static关键字),意味着它现在是一个非静态内部类。因此,创建CityInfo实例必须通过一个MyJson实例来完成,如myJson.new CityInfo()所示。此外,为了设置和获取cityInfo字段,我在MyJson类中添加了setCityInfo和已经存在的getCityInfo方法。首先创建了MyJson的实例myJson,然后通过myJson实例创建了CityInfo的实例cityInfo,设置城市名称,并通过setCityInfo方法将cityInfo实例绑定到myJson上。最后,使用Gson将整个myJson对象序列化为JSON字符串并显示。这样的处理方式符合非静态内部类的使用规则。

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

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

相关文章

C++进修——C++核心编程

内存分区模型 C程序在执行时,将内存大方向划分为4个区域 代码区:存放函数体的二进制编码,由操作系统进行管理全局区:存放全局变量和静态变量以及常量栈区:由编译器自动分配释放,存放函数的参数值&#xff…

静态时序分析:ideal_clock、propagated_clock以及generated_clock的关系及其延迟计算规则(二)

相关阅读 静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html?spm1001.2014.3001.5482 生成时钟 上一节中,我们讨论了理想时钟和传播时钟的创建和使用,本节将讨论生成时钟及其与理想时钟和传播时钟的关系。 图1所示的是一个简…

【2024最新版】图解Mysql数据库配置、命令行及Workbench访问(Windows版本)

目录 1. 准备工作1.1 安装MySQL1.2 验证MySQL的环境变量 2. 环境变量配置3. 访问MySQL3.1 命令行访问MySQL3.2 Workbench访问MySQL 1. 准备工作 1.1 安装MySQL 如果您已经安装了MySQL,请从【2. Mysql 环境配置】开始;如果您没有安装MySQL,请…

iOS17系统适配

iOS17 新功能 文章目录 iOS17 新功能iOS17支持哪几款机型Xcode15新特性iOS17-开发适配指南 横屏待机 在iOS 17中,还带来了横屏待机功能,苹果将这个新功能命名为“Standby”模式,为 iPhone 带来了全新的玩法。iPhone启用之后,默认情…

支持纳管达梦数据库,命令存储支持对接Elasticsearch 8,JumpServer堡垒机v3.10.11 LTS版本发布

2024年6月24日,JumpServer开源堡垒机正式发布v3.10.11 LTS版本。JumpServer开源项目组将对v3.10 LTS版本提供长期的支持和优化,并定期迭代发布小版本。欢迎广大社区用户升级至v3.10 LTS最新版本,以获得更佳的使用体验。 在JumpServer v3.10.…

期末模拟题---期末复习3

头插法建立单链表 #include <stdio.h> #include <stdlib.h>struct Node //定义结构体 {char data; //数据域struct Node * next; //指针域 };/* 请在这里填写答案 */ struct Node * CreateList (struct Node * head) {struct Node *p;char ch;scanf(&…

黑马点评-Redis的缓存击穿,缓存雪崩,缓存穿透,互斥锁

文章目录 1.缓存穿透2.缓存雪崩3.缓存击穿3.1 互斥锁 1.缓存穿透 解决办法 写入NULL值到Redis缓存&#xff0c;以后就会命中Redis的控制缓存而不会出现请求直接打到数据库的问题&#xff01; 代码 2.缓存雪崩 这个概念很好理解&#xff0c;雪崩就是无数的小雪花结构突然因…

百度网盘下载速度慢的解决办法

目录 一、背景 二、解决办法 1、点击三个竖点&#xff0c;再点设置 2、点击传输&#xff0c;再点击去开启该功能 3、点击同意&#xff0c;开启优化速率 三、结果 四、备注 一、背景 当你不是百度网盘会员时&#xff0c;你在使用百度网盘下载时&#xff0c;是否下载速度太…

目前常见的几款企业级im即时通讯软件有哪些?

在目前的市场上&#xff0c;有几款常见的企业级即时通讯软件广受企业青睐。以下是其中几款主流企业级即时通讯软件的介绍和特点。 1. 微软Teams 微软Teams是一款集即时通讯、协作和视频会议功能于一体的企业级通讯软件。它提供了实时聊天、语音通话、视频会议、文件共享和团队…

Golang-channel理解

channel golang-channel语雀笔记整理 channelgolang channel的设计动机&#xff1f;chanel的数据结构/设计思考 golang channel的设计动机&#xff1f; channel是一种不同协程之间实现异步通信的数据结构。golang中有一种很经典的说法是要基于通信实现共享内存&#xff0c;而不…

昇思25天学习打卡营第5天|GAN图像生成

文章目录 昇思MindSpore应用实践基于MindSpore的生成对抗网络图像生成1、生成对抗网络简介零和博弈 vs 极大极小博弈GAN的生成对抗损失&#xff1a; 2、基于MindSpore的 Vanilla GAN3、基于MindSpore的手写数字图像生成导入数据数据可视化模型训练 Reference 昇思MindSpore应用…

Spring Cloud LoadBalancer基础入门与应用实践

官网地址&#xff1a;https://docs.spring.io/spring-cloud-commons/reference/spring-cloud-commons/loadbalancer.html 【1】概述 Spring Cloud LoadBalancer是由SpringCloud官方提供的一个开源的、简单易用的客户端负载均衡器&#xff0c;它包含在SpringCloud-commons中用…

json文件 增删查改

默认收藏夹 qt操作json格式文件... 这个人的 写的很好 我的demo全是抄他的 抄了就能用 —————————— 下次有空把我的demo 传上来 在E盘的demo文件夹 json什么名字

追觅科技25届校招校招24年社招科技北森题库商业推理综合测评答题攻略、通关技巧

一、追觅科技这家公司怎么样&#xff1f; 追觅科技是一家在智能清洁家电领域表现出色的企业。 二、追觅科技待遇怎么样 追觅科技的待遇在业内具有竞争力&#xff0c;具体信息如下&#xff1a; 1. **薪酬结构**&#xff1a;根据对外经济贸易大学招生就业处发布的2023届校园招…

Ubuntu挂载window的网络共享文件夹爱

1.进入win10创建一个用户smb密码也是smb 2.右键进入文件夹共享 3.进入Ubuntu安装支持cifs-utils sudo apt update sudo apt install cifs-utils 4.sudo mkdir /mnt/shared 5.挂载&#xff1a; sudo mount -t cifs -o usernamesm bpasswordsmb //172.16.11.37(windowsIP)/s…

杨幂跨界学术圈:内容营销专家刘鑫炜带你了解核心期刊的学术奥秘

近日&#xff0c;知名艺人杨幂在权威期刊《中国广播电视学刊》上发表了一篇名为《浅谈影视剧中演员创作习惯——以电视剧<哈尔滨一九四四>为例》的学术论文&#xff0c;此举在学术界和娱乐圈均引起了广泛关注。该期刊不仅享有极高的声誉&#xff0c;还同时被北大中文核心…

sheng的学习笔记-AI-密度聚类

AI目录&#xff1a;sheng的学习笔记-AI目录-CSDN博客 需要学习的前置知识&#xff1a;聚类&#xff0c;可参考&#xff1a;sheng的学习笔记-AI-聚类(Clustering)-CSDN博客 什么是密度聚类 密度聚类亦称“基于密度的聚类”(density-based clustering)&#xff0c;此类算法假设…

Linux-笔记 OverlayFS文件系统小应用 恢复功能

前言 通过另一章节 OverlayFS文件系统入门 中已经大致了解了原理&#xff0c;这里来实现一个小应用。通过前面介绍我们已经知道lowerdir是只读层&#xff0c;upperdir是可读写层&#xff0c;merged是合并层&#xff08;挂载点&#xff09;&#xff0c;那么我们可以利用这个机…

【网络】计算机网络-基本知识

目录 概念计算机网络功能计算机网络的组成计算机网络的分类 网络地址网络地址的分类 计算机网络相关性能指标速率带宽吞吐量时延时延的种类&#xff1a; 时延带宽积往返时延RTT利用率 概念 计算机网络是指将多台计算机通过通信设备连接起来&#xff0c;实现数据和资源的共享。…

pandas数据分析(1)

pandas&#xff0c;即Python数据分析库&#xff08;Python data analysis library&#xff09; DataFrame和Series DataFrame&#xff08;数据帧&#xff09;和Series&#xff08;序列&#xff09;是pandas的核心数据结构。DataFrame的主要组件包含索引、列、数据。DataFrame和…