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

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字符串并显示。这样的处理方式符合非静态内部类的使用规则。

相关文章:

Json与Java类

简介 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。JSON数据由键值对构成,并以易于阅读的文本形式展现,支持数组、对象、字符串、数字、布尔值…...

动手学深度学习(Pytorch版)代码实践 -计算机视觉-39实战Kaggle比赛:狗的品种识别(ImageNet Dogs)

39实战Kaggle比赛:狗的品种识别(ImageNet Dogs) 比赛链接:Dog Breed Identification | Kaggle 1.导入包 import torch from torch import nn import collections import math import os import shutil import torchvision from…...

在Linux系统中挂载硬盘

目录 1. 查看硬盘信息 2. 分区硬盘(如果硬盘没有分区) 3. 格式化分区 4. 创建挂载点 5. 挂载分区 6. 验证挂载 7.设置开机自动挂载(可选) 1. 查看硬盘信息 lsblk 这个命令会列出所有的块设备,包括硬盘 2.…...

安卓短视频去水印v1.7 简洁好用

各大平台视频无水印提取,登录即永久会员! 无水印提取,图片无水印提取 视频旋转,倒放,转gif等功能。 链接:https://pan.baidu.com/s/1UgO4V16ZM34tG5uDog74Pg?pwdcn0u 提取码:cn0u...

【征服数据结构】:期末通关秘籍

【征服数据结构】:期末通关秘籍 💘 数据结构的基本概念😈 数据结构的基本概念😈 逻辑结构和存储结构的区别和联系😈 算法及其特性😈 简答题 💘 线性表(链表、单链表)&…...

GIT 基于master分支创建hotfix分支的操作

基于master分支创建hotfix分支的操作通常遵循以下步骤: 切换到master分支: 首先,确保你的工作区是最新的,并且你在master分支上。如果不在master分支,你需要先切换过去。 Bash git checkout master 拉取最新的master…...

Vue-CLI脚手架与node.js安装

前言: Vue-CLI 是一个基于 Vue.js 快速开发单页应用的官方脚手架工具,能够帮助开发者快速搭建前端项目的基础结构。在开始使用 Vue-CLI 前,首先需要安装 Node.js,因为 Vue-CLI 是基于 Node.js 构建的。 Node.js 是一个基于 Chrom…...

自适应站长跑路单页网站源码

跑路单页HTML源码自行修改文字就行了,上传到服务器里面运行即可,本地运行的话音乐会加载不出来,涉及到跨域问题 自适应站长跑路单页网站源码...

Java基础(判断和循环)

一、流程控制语句-顺序结构 顺序结构语句是Java程序默认的执行流程,按照代码的先后顺序,从上到下依次执行。 二、流程控制语句-分支结构(分支结构包括if、switch) if语句:在程序中用来进行判断 1、If语句的第一种格式&#xf…...

51单片机第12步_使用stdio.h库函数仿真串口通讯

本章介绍如何使用stdio.h库函数仿真串口通讯,学会使用view下面的“serial window #1”,实现模拟串口通讯。 Keil C51中有一些关键字,需要牢记: interrupt0:指定当前函数为外部中断0; interrupt1:指定当前函数为定时器0中断&…...

simulink-esp32开发foc电机

1. ESP32 和 STM32 都是流行的微控制器,但它们的刷写方式有所不同。 ESP32 ESP32 可以通过以下几种方式刷写: USB 下载模式:这是最常见的一种刷写方式。将 ESP32 连接到计算机的 USB 端口,然后将 ESP32 置于下载模式。可以使用…...

Python教程--基本技能

】TOC 5.1 解析命令行参数 在Python中,解析命令行参数是一项常见的任务,尤其是在开发命令行工具或脚本时。Python标准库提供了argparse模块,它可以帮助你轻松地编写用户友好的命令行接口。下面是使用argparse模块解析命令行参数的基本步骤&…...

干货分享:Spring中经常使用的工具类(提示开发效率)

环境:Spring5.3…30 1、资源工具类 ResourceUtils将资源位置解析为文件系统中的文件的实用方法。 读取classpath下文件 File file ResourceUtils.getFile(ResourceUtils.CLASSPATH_URL_PREFIX "logback.xml") ; // ...读取文件系统文件 file Resou…...

一文讲懂npm link

前言 在本地开发npm模块的时候,我们可以使用npm link命令,将npm 模块链接到对应的运行项目中去,方便地对模块进行调试和测试 用法 包链接是一个两步过程: 1.为依赖项创建全局软链npm link。一个符号链接,简称软链&a…...

观成科技:证券行业加密业务安全风险监测与防御技术研究

摘要:解决证券⾏业加密流量威胁问题、加密流量中的应⽤⻛险问题,对若⼲证券⾏业的实际流量内容进⾏调研分析, 分析了证券⾏业加密流量⾯临的合规性⻛险和加密协议及证书本⾝存在的⻛险、以及可能存在的外部加密流量威 胁,并提出防…...

使用Swoole开发高性能的Web爬虫

使用swoole开发高性能的web爬虫 Web爬虫是一种自动化获取网络数据的工具,它可以在互联网上收集数据,并且可以被应用于各种不同的领域,如搜索引擎、数据分析、竞争对手分析等。随着互联网规模和数据量的快速增长,如何开发一个高性…...

【Elasticsearch】Elasticsearch索引创建与管理详解

文章目录 📑引言一、Elasticsearch 索引的基础概念二、创建索引2.1 使用默认设置创建索引2.2 自定义设置创建索引2.3 创建索引并设置映射 三、索引模板3.1 创建索引模板3.2 使用索引模板创建索引 四、管理索引4.1 查看索引4.2 更新索引设置4.3 删除索引 五、索引别名…...

[数据集][目标检测]棉花检测数据集VOC+YOLO格式389张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):389 标注数量(xml文件个数):389 标注数量(txt文件个数):389 标注类别…...

使用Java实现实时数据处理系统

使用Java实现实时数据处理系统 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 引言 在当今信息爆炸的时代,实时数据处理系统变得越来越重要。无论…...

整合web-socket的常见bug

整合文章连接 此文是记录我上网查找整合方案时候踩的坑,特别是注册失败的问题,比如还有什么去掉Compoent就可以,但是这样这个端点就失效了 特别是报错: at org.springframework.web.socket.server.standard.ServerEndpointExporter.registerEndpoint(ServerEndpointExporter.…...

【Oracle APEX开发小技巧12】

有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...

站群服务器的应用场景都有哪些?

站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...

并发编程 - go版

1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...