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.mfbz.cn/a/757910.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第十一节:学习通过动态调用application.properties参数配置实体类(自学Spring boot 3.x的第二天)

大家好,我是网创有方。这节实现的效果是通过代码灵活地调用application.properties实现配置类参数赋值。 第一步:编写配置类 package cn.wcyf.wcai.config;import org.springframework.beans.factory.annotation.Value; import org.springframework.boo…

ManicTime(屏幕时间统计工具) 专业版值得购买吗

ManicTime 是 Windows 平台上,一款支持跟踪、标记用户在每个软件上所花时间的工具,它能自动归类生成时间使用报表,帮助用户分析及改善工作效率。 ManicTime 不仅会在后台记录、统计所有窗口的使用时间,还能自动截图存档到本地&a…

Matlab|【需求响应】空调负荷需求响应模型

1主要内容 程序主要复现《溫控负荷的需求响应潜力评估及其协同优化管理研究_谢敦见》2.5部分章节的内容,建立空调负荷的聚合模型,考虑调节空调温度对空调响应潜力的影响,程序结果充分说明随着上调温度增大,响应程度逐渐增大。 具…

【算法训练记录——Day36】

Day36——贪心Ⅳ 1.leetcode_452用最少数量的箭引爆气球2.leetcode_435无重叠区间3.leetcode_763划分字母区间4.leetcode_ 1.leetcode_452用最少数量的箭引爆气球 思路:看了眼题解,局部最优:当气球出现重叠,一起射,所用…

[数据集][目标检测]围栏破损检测数据集VOC+YOLO格式1196张1类别

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

【操作系统期末速成】EP05 | 学习笔记(基于五道口一只鸭)

文章目录 一、前言🚀🚀🚀二、正文:☀️☀️☀️2.1 考点十一:死锁的概念与预防2.2 考点十二:死锁的避免一银行间算法2.1 考点十三:死锁的检测与解除 一、前言🚀🚀&#x…

【小沐学AI】Python实现语音识别(faster-whisper-webui)

文章目录 1、简介1.1 whisper1.2 faster-whisper 2、安装3、测试结语 1、简介 1.1 whisper https://github.com/openai/whisper Whisper 是一种通用语音识别模型。它是在各种音频的大型数据集上训练的,也是一个多任务模型,可以执行多语言语音识别、语音…

C语言 | Leetcode C语言题解之第205题同构字符串

题目&#xff1a; 题解&#xff1a; struct HashTable {char key;char val;UT_hash_handle hh; };bool isIsomorphic(char* s, char* t) {struct HashTable* s2t NULL;struct HashTable* t2s NULL;int len strlen(s);for (int i 0; i < len; i) {char x s[i], y t[i]…

51单片机第11步_在C语言中插入汇编语言

本章重点介绍如何在C语言中插入汇编语言。要不是有记录&#xff0c;真不知道怎么搞。 /* 你在 Project Workspace窗口中,将光标移到DELAY.c处,点下鼠标右键,选择"Options for file DELAY.c", 点击右边的"Generate Assembler SRC File"和“Assemble SRC …

【VMware】VMware 开启的虚拟机无法联网的解决方案

目录 &#x1f30a;1. 问题说明 &#x1f30a;2. 解决方案 &#x1f30d;2.1 查看虚拟网络编辑器 &#x1f30d;2.2 设置 vmnet &#x1f30d;2.3 设置虚拟机网络 &#x1f30d;2.4 Xshell连接虚拟机 &#x1f30a;1. 问题说明 虚拟机 ping 其他网页显示失败,比如&#…

Python逻辑控制语句 之 判断语句--石头剪刀布案例

需求&#xff1a; 1. 从控制台输入要出的拳 —— 石头&#xff08;1&#xff09;&#xff0f;剪刀&#xff08;2&#xff09;&#xff0f;布&#xff08;3&#xff09; 2. 电脑随机出拳 —— 先假定电脑只会出石头&#xff0c;完成整体代码功能 3. 比较胜负 胜负规则&#x…

【PL理论深化】(12) Ocaml 语言:高阶函数 | map 函数 | filter 函数 | fold 函数

&#x1f4ac; 写在前面&#xff1a;在函数式编程中&#xff0c;除了递归函数外&#xff0c;还经常使用高阶函数。高阶函数是指接收其他函数作为参数或返回另一个函数的函数。高阶函数通过抽象编程模式以实现重用&#xff0c;使程序可以在更高层次上进行编写。让我们重点看看常…

Webpack: 核心配置结构

概述 Webpack 是一种 「配置」 驱动的构建工具&#xff0c;所以站在应用的角度&#xff0c;必须深入学习 Webpack 的各项配置规则&#xff0c;才能灵活应对各种构建需求。本文将作为小册应用系列的一个总结&#xff0c;汇总与应用配置相关的各项知识点&#xff0c;包括&#x…

酒店客房管理系统(Java+MySQL)

技术栈 Java: 作为主要编程语言。Swing GUI: 用于开发图形用户界面。MySQL: 作为数据库管理系统。JDBC: 用于连接和操作MySQL数据库。 功能要点 管理登录认证 系统提供管理员登录认证功能。通过用户名和密码验证身份&#xff0c;确保只有授权的用户可以访问和管理酒店客房信…

数据结构复习指南

数据结构复习指南 本文中列举了数据结构期末考试可能存在的考点 绪论 数据的基本单位 数据元素是数据的基本单位 数据项 数据项是组成数据的、有独立含义的、不可分割的最小单位。 数据对象 数据对象是性质相同的数据元素的集合&#xff0c;是数据的一个子集。 数据结…

KBL410-ASEMI智能AI专用整流桥KBL410

编辑&#xff1a;ll KBL410-ASEMI智能AI专用整流桥KBL410 型号&#xff1a;KBL410 品牌&#xff1a;ASEMI 封装&#xff1a;KBL-4 正向电流&#xff08;Id&#xff09;&#xff1a;4A 反向耐压&#xff08;VRRM&#xff09;&#xff1a;1000V 正向浪涌电流&#xff1a;2…

系统运维面试总结(系统权限)

系统运维面试总结&#xff08;系统权限&#xff09; 一、权限优化简述Linux权限划分原则二、备份策略三、Raid四、资源查看五、Linux启动流程 一、权限优化简述Linux权限划分原则 ckhunter也是一款常用的Linux杀毒软件 不可修改但可删除 二、备份策略 供参考较为全面的备份方案…

【操作系统】进程管理——进程的概念、组成和特征(个人笔记)

学习日期&#xff1a;2024.6.29 内容摘要&#xff1a;进程的基本概念和特征、状态和转换 进程的概念 程序与进程 程序&#xff1a;是静态的&#xff0c;是存放在磁盘里的可执行文件&#xff0c;就是一系列的指令集合 进程&#xff08;Process&#xff09;&#xff1a;是动态…

基于STM32的智能家用电力管理系统

目录 引言环境准备智能家用电力管理系统基础代码实现&#xff1a;实现智能家用电力管理系统 4.1 数据采集模块4.2 数据处理与分析4.3 控制系统实现4.4 用户界面与数据可视化应用场景&#xff1a;电力管理与优化问题解决方案与优化收尾与总结 1. 引言 智能家用电力管理系统通…

6.优化算法之模拟

1.替换所有的问号 . - 力扣&#xff08;LeetCode&#xff09; class Solution {public String modifyString(String s) {char[] sss.toCharArray();int nss.length;for(int i0;i<n;i){if(ss[i]?){for(char cha;ch<z;ch){if((i0||ss[i-1]!ch)&&(in-1||ss[i1]!c…