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.mzph.cn/news/863461.shtml

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

相关文章

笔灵AI写作:释放创意,提升写作效率的秘诀

内容为王,在内容创作的世界中尤为重要。然而,面对写作时常常感到无从下手:有时缺乏灵感,有时难以表达清楚自己的想法。AI写作助手的出现,为这些问题提供了创新的解决方案,极大地改变了内容创作的过程。 今…

Pytest+Allure+Yaml+Jenkins+Gitlab接口自动化中Jenkins配置

一、背景 Jenkins(本地宿主机搭建) 拉取GitLab(服务器)代码到在Jenkins工作空间本地运行并生成Allure测试报告 二、框架改动点 框架主运行程序需要先注释掉运行代码(可不改,如果运行报allure找不到就直接注释掉) …

C++知识点总结 (02):C++中的语句(简单语句、条件语句、迭代语句、跳转语句、异常处理语句、try语句等)

文章目录 1、简单语句(1)空语句(2)复合语句 2、条件语句3、迭代语句(1)常规for循环(2)范围for循环(3)while和do...while 4、跳转语句(1)break(2)continue(3)goto 5、异常处理语句(1)标准异常(2)throw抛出异常 6、try语句 1、简单语句 (1)空语句 ; (2)复合语句 用花括号括起来的…

nginx添加模块

问题描述:已经在运行的宝塔中的nginx如何添加模块 1. 进入宝塔nginx的脚本目录 cd /www/server/panel/install 2. 读修改宝塔官方写的脚本 vim nginx.sh 3. 找到字符 ./configure - 添加模块 --add-module/home/root/app/nginx-module/echo-nginx-module-0.62 …

Linux笔记之Bash脚本中的EOF

Linux笔记之Bash脚本中的EOF code review! 文章目录 Linux笔记之Bash脚本中的EOF基本用法自定义结束符变量替换禁用变量替换用于脚本嵌入重定向到文件与命令组合总结 在 Bash 脚本中, EOF 通常用于定义一个多行字符串或文档块。这种技术被称为“Here Document”&a…

什么是等级保护2.0?

等保的全称是信息安全等级保护,是《网络安全法》规定的必须强制执行的,保障公民、社会、国家利益的重要工作。 官方定义:等级保护是对信息和信息载体按照重要性等级分级别进行保护的一种工作,指对国家重要信息、法人和其他组织及公…

git通过命令方式push代码到远程

本地仓库和远程仓库关联操作 通过关联远程分支可以将本地的分支与远程仓库中的分支进行关联,从而实现本地分支与远程分支的同步和交互。 关联远程分支的步骤如下: 1. 首先,使用git remote -v命令查看当前仓库关联的远程仓库。 git remote …

认识100种电路之放大电路

在电子技术的广袤世界中,放大电路犹如一颗璀璨的明珠,发挥着至关重要的作用。那么,为什么电路需要放大?放大的原理又是什么?实现放大又需要用到哪些元器件以及数量如何呢?接着往下看,会解开你的…

intellij idea中使用R语言plot画图无图像问题

1、在intellij idea中使用R语言plot函数时,会遇到各种各样的问题,会出现图片不显示问题, 可以看到,目前我电脑r语言版本为4.2.1,输入下面代码: # # 安装包 # install.packages(ggplot2) # library(ggplot2…

【Lua】第三篇:基本变量类型介绍

文章目录 一. 变量类型介绍二. 基本知识三. 基本类型介绍1. 空类型(nil)2. 数值类型(number)3. 字符串类型(string)4. 布尔类型(boolean) 一. 变量类型介绍 Lua中一共有如下8中变量…

Geotools系列说明之JTS空间几何介绍

JTS介绍 The JTS Topology Suite is a Java API that implements a core set of spatial data operations using an explicit precision model and robust geometric algorithms. It provides a complete model for specifying 2-D linear Geometry. Many common operations i…

Qt的入门

Qt的入门 1.Qt的配置2.介绍Qt的使用2.1 Qt 5.14.22.2 Linguist 5.14.22.3Designer 5.14.22.4 Assistant 5.14.22.5 Qt Creator 4.11.1 3.创建第一个项目3.1点击文件来新建一个新的文件或项目3.2选择项目路径和名称3.3选择构建工具3.4类信息3.5翻译文件3.6选择编译器3.7项目管理…

在navicat对mysql声明无符号字段

1.无符号设置 在 MySQL 中,我们可以使用 UNSIGNED 属性来设置列的无符号属性,这意味着该列只能存储非负整数值。对于一些需要存储正整数的列,比如年龄、数量等,使用 UNSIGNED 属性可以提高数据存储和查询的效率,并且能…

智能工业网络,需要何种工业以太网交换机作为支撑?

随着工业企业数字化及信息化的进一步深化升级,工业领域相关控制及信息系统的业务类型不断增加、复杂性不断提升,工业控制网络与工业信息网络也呈现融合趋势,具备支持多业务、多协议、多厂商设备和数据的互联互通、共网承载以及高质量传输能力…

【源码+文档+调试讲解】actual self 服装店的设计与实现

摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统服装销售信息管理难度大,容错率低&#xff0c…

VSCode + GDB + J-Link 单片机程序调试实践

VSCode GDB J-Link 单片机程序调试实践 本文介绍如何创建VSCode的调试配置,如何控制调试过程,如何查看修改各种变量。 安装调试插件 在 VSCode 扩展窗口搜索安装 Cortex-Debug插件 创建调试配置 在 Run and Debug 窗口点击 create a launch.json …

【单片机毕业设计11-基于stm32c8t6的智能水质检测】

【单片机毕业设计11-基于stm32c8t6的智能水质检测】 前言一、功能介绍二、硬件部分三、软件部分总结 前言 🔥这里是小殷学长,单片机毕业设计篇11基于stm32的智能水质检测系统 🧿创作不易,拒绝白嫖可私 一、功能介绍 -------------…

Java----面向对象----总复习

面向对象 面向对象的程序设计思想(Object Oriented Programming),简称OOP.是一种设计者思想.关注的焦点是类,参照现实中的事务,将事务的属性特征,行为抽象出来,用类来表示.代码结构:以类为组织单位,每种事务都有自己的属性和行为,功能, 思想:从宏观上 帮助我们把握,整体分析整…

Bazel plugin for Visual Studio Code

语法突出显示 Bazel Build Targets 树显示工作区中的构建包/目标BUILD 文件中的 CodeLens 链接可通过单击目标直接启动构建或测试Buildifier 集成以检查和格式化您的 Bazel 文件(需要安装 Buildifier)tasks.json 的 Bazel Task 定义在构建期间调试 .bzl…

C++:静态断言内存对齐

静态断言 C中的断言assert (1)直接参考:https://www.cnblogs.com/lvchaoshun/p/7816288.html (2)C的assert是运行时检测发现错误,而不是编译时 (3)C在编译时错误用#error来输出C静态断言 (1)C引入static_assert(表达式, “提示字符串”)来实现编译时的静…