JSONObject - 用最通俗的讲解,教你玩转 JSON 数据的解析和修改

目录

一、JSONObject

1.1、为什么要使用他?

1.2、应用

1.2.1、依赖

1.2.2、JSON 数据示例

1.2.3、JSON 数据的构建

1.2.4、JSON 数据的解析


一、JSONObject


1.1、为什么要使用他?

在还没有接触过这个东西的时候,一直是通过 ObjectMapper 进行 JSON 的序列化和反序列化,尤其是将 JSON 数据进行解析还需要提供一个具体的类...  就算不提供具体的类,使用 JsonNode 读取数据,涉及到修改还要强转 ObjectNode 就很麻烦~ 

而且如果要构造一个 JSON 格式的数据,可能最先想到的就是通过 HashMap ,但是一但要构造的 JSON 数据稍微复杂一点,就要嵌套不少,代码的简洁、可读性大大降低.

然而在实习的时候,作为后端开发,有需要和这些数据常常打交道,所以就学到了一种处理 JSON 数据的神器——JSONObject

接下俩我们直接通过实战来看看为什么是神器~

1.2、应用

1.2.1、依赖

        <dependency>
            <groupId>com.vaadin.external.google</groupId>
            <artifactId>android-json</artifactId>
            <version>0.0.20131108.vaadin1</version>
        </dependency>

所在包:import org.json.JSONObject;

1.2.2、JSON 数据示例

例如有如下 JSON 数据

    private static final String msg = """
            {
                "file": {
                    "user": {
                        "name": "cyk",
                        "age": 20,
                        "likes": ["弹钢琴", "敲代码", "唱歌", "亲亲"]
                    },
                    "admin": {
                        "name": "lyj"
                    }
                }
            }
            """;

Ps:likes 这里是一个 JSON 数组,因此需要通过 JSONArray 来构造. 

1.2.3、JSON 数据的构建

a)主要方法就是 put(),返回值是一个 JSONObject,参数可以如下:

b)解读: JSONObject 对象就像是一个容器(实际上底层也是 Map),可以简单的想象成一对大括号 "{ }",这个对象有 put 方法,方法的参数就是一个键值对,返回值就是 JSONObject 本身.  实际上 put 就是往这对大括号里面装东西.  如果 key 存在就覆盖,key 不存在就添加.

理解上述,就不难构造啦~

        //1.构建最外层大括号
        JSONObject parent = new JSONObject();
        //2.key 就是 "file", value 又是一个大的 json 数据(可以简单理解为一对大括号算一个 JSON 数据)
        JSONObject fileJO = new JSONObject();
        //3.再往里有两个 key,分别是 user 和 admin, value 又是 json 数据
        JSONObject userJO = new JSONObject();
        JSONObject adminJO = new JSONObject();
        //4.注意 user 中有一个 json 数组
        JSONArray array = new JSONArray();
        //5.接下来就是简单的赋值啦
        array.put("弹钢琴");
        array.put("敲代码");
        array.put("唱歌");
        array.put("和女朋友玩游戏");
        userJO.put("name", "cyk");
        userJO.put("age", 20);
        userJO.put("likes", array);
        adminJO.put("name", "lyj");
        fileJO.put("user", userJO);
        fileJO.put("admin", adminJO);
        parent.put("file", fileJO);

当你把 JSONObject 就想象成一个大括号,每次 put 就是在往里面放元素,就会发现,也可以写出如下优雅的代码~

        JSONObject parent = new JSONObject().put("file",
                new JSONObject()
                        .put("user", new JSONObject()
                                .put("name", "cyk")
                                .put("age", 20)
                                .put("likes", new JSONArray().put("弹钢琴").put("敲代码").put("唱歌").put("和女朋友玩游戏")))
                        .put("admin", new JSONObject().put("name", "lyj")));

c)输出如下:

1.2.4、JSON 数据的解析

a)主要方法如下:

  • get() :参数就是 json 中的 key,是 String 类型; 返回值就是 key 对应的 value,返回值是 Object.
  • getJSONObject():参数是 json 中的 key,是 String类型;返回值 key 对应的 value,类型是 JSONObject.
  • getJSONArray():参数是 json 中的 key ,是 String 类型;返回值是 key 对应 json 数组,类型是 JSONArray. 

b)解读:上述三个方法都可以理解为,每次 get 实际上都是将 key+{} 和 value 之间 的一次剥离,使你拿到对应的 value,只是返回值类型不同而已.

        //1.将 json 数据放入 parent 中
        JSONObject parent = new JSONObject(msg); //这里也可以放 map
        //这里列举几种情况
        //a) 获取 file 的 value 值
        JSONObject file = parent.getJSONObject("file");//这里不建议直接用 get (强转 toString() 会有奇怪的报错),因为获取到的值实际上还是一个 JSON 格式数据
        System.out.println(file.toString());

        //b) 获取 user 下的 name 对应的 value 值
        String name = (String) parent
                .getJSONObject("file") //返回的是 JSONObject 对象,因此还可以继续往里读取
                .getJSONObject("user")
                .get("name");   //这里就不能再使用 getJSONObject 获取 JSONObject 都对象了,因为 name 后面没有大括号可以解析了
        System.out.println("name: " + name);

        //c) 获取 user 下的 likes 数组
        String likes = String.valueOf(parent
                .getJSONObject("file")
                .getJSONObject("user")
                .getJSONArray("likes")); // 注意这里是一个 JSONArray 数组
        System.out.println("likes: " + likes);

c)输出如下:

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

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

相关文章

保护国家机密:Java国密加解密算法在信息安全中的应用与挑战

目录 1、简介 1.1 信息安全的重要性 1.2 Java国密加解密算法的概述 2、Java国密加解密算法的应用 2.1 数据加密与解密 2.2 网络通信加密 2.3 数字签名与验证 2.4 安全存储与传输 3、Java国密加解密算法的特点 3.1 安全性强 3.2 效率高 3.3 弹性可调 4、Java国密加…

(2024,密集量子电路,量子 U-Net,幺正单采样)量子去噪扩散模型

Quantum Denoising Diffusion Models 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 2. 相关工作 2.1. 扩散模型 2.2. 变分量子电路 2.3. 量子扩散模型 3. 量子去噪扩散模…

HarmonyOS 转场动画 ForEach控制

本文 我们继续说组件的专场特效 上文 HarmonyOS 转场动画 我们通过if控制了转场效果 本文 我们通过 ForEach 控制它的加载和删除 这时候就有人会好奇 ForEach 怎么控制删除呢&#xff1f; 很简单 循环次数不同 例如 第一次 10个 第二次 5个 那么后面的五个就相当于删除啦 我们…

JVM垃圾回收机制及思维导图

一、Java垃圾回收机制 在java中&#xff0c;程序员是不需要显示的去释放一个对象的内存的&#xff0c;而是由虚拟机自行执行。在JVM中&#xff0c;有一个垃圾回收线程&#xff0c;它是低优先级的&#xff0c;在正常情况下是不会执行的&#xff0c;只有在虚拟机空闲或者当前堆内…

【Alibaba工具型技术系列】「EasyExcel技术专题」实战技术针对于项目中常用的Excel操作指南

这里写目录标题 EasyExcel教程Maven依赖 EasyExcel API分析介绍EasyExcel 注解通用参数ReadWorkbook&#xff08;理解成excel对象&#xff09;参数ReadSheet&#xff08;就是excel的一个Sheet&#xff09;参数注解参数通用参数 WriteWorkbook&#xff08;理解成excel对象&#…

k8s学习-Deployment

Kubernetes通过各种Controller来管理Pod的生命周期 。 为了满足不同业 务 景 &#xff0c; Kubernetes 开发了Deployment、ReplicaSet、DaemonSet、StatefuleSet、Job等多种Controller。我们⾸先学习最常用Deployment。 1.1 Kubectl命令直接创建 第一种是通过kubectl命令直接…

java读取配置文件数据

在实际开发中&#xff0c;项目中难免会有一些秘钥或者不经常使用到的配置信息&#xff0c;此时&#xff0c;就可以将这些配置信息统一写到配置文件中。随后使用Value注解读取配置文件的值来向Spring中Bean的属性设置值。 例如&#xff0c;一些系统环境变量信息&#xff0c;数据…

路飞项目--02

补充&#xff1a;axios封装 # 普通使用&#xff1a;安装 &#xff0c;导入使用 const filmListreactive({result:[]}) axios.get().then() async function load(){let responseawait axios.get()filmList.resultresponse.data.results } # 封装示例&#xff1a;请求发出去之前…

让代码运行得更快:深入理解进程、线程和协程

让代码运行得更快&#xff1a;深入理解进程、线程和协程 什么是执行体 在深入探讨进程、线程和协程之前&#xff0c;我想先介绍下执行体这个概念。 执行体这个词语是我从七牛云创始人许式伟大佬的专栏中学到的&#xff0c;它代表操作系统中程序执行的载体&#xff0c;涉及到…

makefile,make,gcc/g++ 编译流程分析

文章目录 makefile&#xff0c;make&#xff0c;gcc/g 编译流程分析 makefile&#xff0c;make&#xff0c;gcc/g 编译流程分析 C实现加减乘除四个运算 // // Created by qiufh on 2024-01-17. //#include "add.h"int add(int a, int b) {return a b; } // // Cre…

C++的命名空间域

一、域作用限定符 :: 即是域作用限定符&#xff0c;它的作用是指明一个标识符&#xff08;变量、函数或类&#xff09;来自哪一个作用域范围 二、编译器搜索变量、函数等的原则 1.先搜索局部变量&#xff0c;2.再搜索全局变量&#xff0c;3.最后搜索指定的命名空间域 三、…

python数字图像处理基础(十)——背景建模

目录 背景建模背景消除-帧差法混合高斯模型 背景建模 背景建模是计算机视觉和图像处理中的一项关键技术&#xff0c;用于提取视频中的前景对象。在视频监控、运动检测和行为分析等领域中&#xff0c;背景建模被广泛应用。其基本思想是通过对视频序列中的像素进行建模&#xff…

构建中国人自己的私人GPT—限时免费部署

在现实生活中&#xff0c;很多公司或个人的资料是不愿意公布在互联网上的&#xff0c;但是我们又要使用人工智能的能力帮我们处理文件、做决策、执行命令那怎么办呢&#xff1f;于是我们构建自己或公司的本地专属GPT变得非常重要。 先看效果&#xff1a; 解方程&#xff0c;24小…

用友GRP-U8 obr_zdybxd_check.jsp SQL注入漏洞复现

0x01 产品简介 用友GRP-U8R10行政事业内控管理软件是用友公司专注于国家电子政务事业,基于云计算技术所推出的新一代产品,是我国行政事业财务领域最专业的政府财务管理软件。 0x02 漏洞概述 用友GRP-U8R10行政事业内控管理软件 obr_zdybxd_check.jsp 接口处存在SQL注入漏洞…

day-13 拿出最少数目的魔法豆

思路 将beans的每个数值当做袋子最后豆子剩余数&#xff0c;选择取豆子最少的一种方案 解题方法 //从小到大&#xff0c;将每个beans[i]作为剩余豆子数 //对于beans[i]&#xff0c;i之前的全为零&#xff0c;i之后的全变为beans[i] ansMath.min(ans,sum-(beans.length-i)*bean…

esp32-idf eclipse 定时器的使用demo

esp32定时器的使用demo 1、介绍 ESP32芯片包含两个硬件定时器组。每组有两个通用硬件定时器。它们都是基于16位预分频器和64位自动重载功能的向上向下计数器的64位通用定时器。 2、API接口函数 创建定时器函数&#xff1a; esp_timer_create(); esp_err_t esp_timer_create …

动态pv(nfs方式挂载)

1、定义 发布pvc之后可以生成pv&#xff0c;还可以在共享服务器上直接生成挂载目录 pvc直接绑定和使用pv 2、动态pv依赖两个组件 &#xff08;1&#xff09;provisioner卷插件&#xff1a;k8s本身支持的动态pv创建不包括nfs&#xff0c;需要声明和安装一个外部插件provisio…

16.鸿蒙HarmonyOS App(JAVA)滑块组件Slider与评级组件Rating

16.鸿蒙HarmonyOS App(JAVA)滑块组件Slider与评级组件Rating ability_main.xml <?xml version"1.0" encoding"utf-8"?> <DirectionalLayoutxmlns:ohos"http://schemas.huawei.com/res/ohos"ohos:height"match_parent"oh…

「优选算法刷题」:盛最多水的容器

一、题目 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不能倾斜容器…

第29关 阿里云开源的k8s容器秒级事件监控软件-Kube-eventer

------> 课程视频同步分享在今日头条和B站 大家好&#xff0c;我是博哥爱运维。这节课给大家分析一款K8S上宝藏级秒级事件监控报警的开源软件kube-eventer&#xff0c;它是由阿里云开源的&#xff0c;并且难得的还一直有在更新。 天下武功&#xff0c;唯快不破。对于报警监…