【Java干货教程】JSON,JSONObject,JSONArray类详解

一、定义

JSON:就是一种轻量级的数据交换格式,被广泛应用于WEB应用程序开发。JSON的简洁和清晰的层次结构,易于阅读和编写;同时也易于机器解析和生成,有效的提升网络传输效率;支持多种语言,很多流行的语言都对JSON格式有着很友好的支持。

  • JSON对象:就是多个属性被{}括起来的。
  • JSON数组:就是包含了多个JSON对象的一个集合,数组是以数组括号[]括起来的。JSON数组并不一定是要相同的JSON对象的集合,也可以是不同的对象。

JSON、JSON对象、JSON数组的区别 

  • JSON是一种数据结构,类型xml;
  • JSON对象则是对JSON的具体体现;JSON数组则是将多个JSON对象进行存储的一个集合。

这里以fastjson2来进行讲解,不同的jar包对JSON相关的处理有着不同的实现方式,但是大部分方法也都是相同的。

二、fastjson2

2.1、fastjson2简介

fastjson2 是 FASTJSON 项目的重要升级,目标是为下一个十年提供一个高性能的JSON库, fastjson2 性能相比原先旧的 fastjson 有了很大提升,并且 fastjson2 更安全,完全删除autoType白名单,提升了安全性。

中文文档: 

​​​​https://github.com/alibaba/fastjson2/blob/main/README.md

下面是一些常用的方法 

2.2、导入fastjson2依赖

maven如下:pom(本文所有代码仅使用这一个依赖即可):

    <dependencies>
        <dependency>
            <groupId>com.alibaba.fastjson2</groupId>
            <artifactId>fastjson2</artifactId>
            <version>2.0.26</version>
        </dependency>
    </dependencies>

需要注意的一点是在使用 fastjson2 时导入的包名是 com.alibaba.fastjson2 ,就像下面这样:

import com.alibaba.fastjson2.JSON;

import com.alibaba.fastjson2.JSONObject;

import com.alibaba.fastjson2.JSONArray;

2.3、json对象与json数组的创建

2.3.1、json对象创建

import com.alibaba.fastjson2.JSONObject;
 
public class Demo {
    public static void main(String[] args) {
        JSONObject info = new JSONObject();
        info.put("name", "张三");
        info.put("age", "18");
        info.put("地理", "70");
        info.put("英语", "60");
 
        System.out.println(info);
    }
}

2.3.2、json数组创建

import com.alibaba.fastjson2.JSONArray;
 
public class Demo {
    public static void main(String[] args) {
        JSONArray array = new JSONArray();
        array.add("1班");
        array.add("2班");
        array.add("3班");
 
        System.out.println(array);
    }
}

2.3.2、json对象添加到json数组

import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
 
public class Demo {
    public static void main(String[] args) {
        JSONObject info1 = new JSONObject();
        info1.put("name", "张三");
        info1.put("age", "18");
        JSONObject info2 = new JSONObject();
        info2.put("name", "李四");
        info2.put("age", "19");
 
        //把上面创建的两个json对象加入到json数组里
        JSONArray array = new JSONArray();
        array.add(info1);
        array.add(info2);
 
        System.out.println(array);
    }
}

2.4、json对象取值与json数组遍历取值

2.4.1、json对象取值

import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
 
public class Demo {
    public static void main(String[] args) {
        JSONArray array = new JSONArray();
        array.add("1班");
        array.add("2班");
        array.add("3班");
        JSONObject school = new JSONObject();
        school.put("schoolName", "第一中学");
        school.put("teacher", "刘梅");
 
        JSONObject info = new JSONObject();
        info.put("name", "张三");
        info.put("age", "18");
        info.put("gradle", array);
        info.put("schoolInfo", school);
 
        //从info中取值
        System.out.println(info.getString("name")); //张三
        System.out.println(info.getIntValue("age"));//18
        System.out.println(info.getJSONArray("gradle"));//["1班","2班","3班"]
        System.out.println(info.getJSONObject("schoolInfo"));//{"schoolName":"第一中学","teacher":"刘梅"}
    }
}

2.4.2、json数组遍历取值 

import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
 
public class Demo {
    public static void main(String[] args) {
        JSONObject info1 = new JSONObject();
        info1.put("name", "张三");
        info1.put("age", "18");
        JSONObject info2 = new JSONObject();
        info2.put("name", "李四");
        info2.put("age", "19");
 
        JSONArray array = new JSONArray();
        array.add(info1);
        array.add(info2);
        //遍历获取json数组中对象的值
        for (int i = 0; i < array.size(); i++) {
            JSONObject json = array.getJSONObject(i);
            System.out.println(json.getString("name"));
            System.out.println(json.getString("age"));
        }
    }
}

2.5、json对象与字符串的转换 

2.5.1、json对象与字符串的转换

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
 
public class Demo {
    public static void main(String[] args) {
        JSONObject info = new JSONObject();
        info.put("name", "张三");
        info.put("age", "18");
        info.put("地理", "70");
        info.put("英语", "60");
 
        //JSON对象转字符串
        String str = JSON.toJSONString(info);
        System.out.println(str);
        //JSON字符串转JSON对象
        JSONObject json = JSONObject.parseObject(str);
        System.out.println(json);
    }
}

2.5.2、json字符串的字节数组转json对象

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
 
public class Demo {
    public static void main(String[] args) {
        String str = "{\"name\":\"张三\",\"age\":\"18\",\"地理\":\"70\",\"英语\":\"60\"}";
 
        byte[] bytes = str.getBytes();
        JSONObject data = JSON.parseObject(bytes);
 
        System.out.println(data);
    }
}

2.6、json数组与字符串的转换

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
 
public class Demo {
    public static void main(String[] args) {
        String text = "[\"张三\",\"李四\",\"王五\"]";
        System.out.println(text);
 
        //json字符串转json数组
        JSONArray data = JSON.parseArray(text);
        //json数组转json字符串
        String str = JSONArray.toJSONString(data);
 
        System.out.println(data);
        System.out.println(str);
    }
}

2.7、json字符串转java对象的转换 

Student类如下:

public class Student {
    public String name;
    public int age;
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public int getAge() {
        return age;
    }
 
    public void setAge(int age) {
        this.age = age;
    }
 
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

2.7.1、json字符串转java对象的转换

import com.alibaba.fastjson2.JSON;
 
public class Demo {
    public static void main(String[] args) {
        Student student = new Student("张三", 18);
 
        //Student对象转JSON字符串
        String studentStr = JSON.toJSONString(student);
        //JSON字符串转Student对象
        Student data = JSON.parseObject(studentStr, Student.class);
 
        System.out.println(studentStr);
    }
}

2.7.2、java对象转byte数组转换 

import com.alibaba.fastjson2.JSON;
 
public class Demo {
    public static void main(String[] args) {
        Student student = new Student("张三", 18);
 
        //Student对象转字节数组
        byte[] text = JSON.toJSONBytes(student);
        //字节数组转Student对象
        Student data = JSON.parseObject(text, Student.class);
 
        System.out.println(data.getName() + data.getAge());
    }
}

2.8、json字符串与Map转换 

2.8.1、json字符串转Map

@Test
    public void test05(){
        String str = "{\n" +
                "\"gradle\":\"高一\",\n" +
                "\"number\":\"2\",\n" +
                "\"people\":[{\"name\":\"张三\",\"age\":\"15\",\"phone\":\"123456\"},\n" +
                "         {\"name\":\"李四\",\"age\":\"16\",\"phone\":\"78945\"}]\n" +
                "}";
        Map<String, Object> map1 = JSONObject.parseObject(str, new TypeReference<Map<String, Object>>() {
                });
        Map map2 = JSON.parseObject(str, Map.class);
        System.out.println(map1);
        System.out.println(map2);

    }

2.8.2、Map转json字符串

(注意:如果直接使用JSON.toJSONString(map)转换,因为"测试1"的值为null,转换的结果就会是 {“测试2”:“hello”})

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONWriter;
 
import java.util.HashMap;
import java.util.Map;
 
public class Demo {
    public static void main(String[] args) {
        Map<String, String> map = new HashMap<>();
        map.put("测试1", null);
        map.put("测试2", "hello");
 
        //{"测试2":"hello","测试1":null}
        String str = JSON.toJSONString(map, JSONWriter.Feature.WriteMapNullValue);
 
        System.out.println(str);
    }
}

如果你使用的是老的fastjson1(下述是简单示例,不可使用),可以像下面这样转换:

Map<String, String> map = new HashMap<>();
map.put("测试1", null);
map.put("测试2", "hello");
String str = JSON.toJSONString(map, SerializerFeature.WriteMapNullValue) ;

2.9、json数组转List

import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
 
import java.util.List;
import java.util.Map;
 
public class Demo {
    public static void main(String[] args) {
        String str = "{\n" +
                "\"gradle\":\"高一\",\n" +
                "\"number\":\"2\",\n" +
                "\"people\":[{\"name\":\"张三\",\"age\":\"15\",\"phone\":\"123456\"},\n" +
                "         {\"name\":\"李四\",\"age\":\"16\",\"phone\":\"78945\"}]\n" +
                "}";
 
        JSONObject strJson = JSONObject.parseObject(str);
        //获取people数组
        JSONArray people = strJson.getJSONArray("people");
        //json数组转List
        List<Map> list = people.toJavaList(Map.class);
 
        System.out.println(str);
    }
}

如果你使用的是老的fastjson1,可以像下面这样转换:    

String str = "{\n" +
 
                "\"gradle\":\"高一\",\n" +
 
                "\"number\":\"2\",\n" +
 
                "\"people\":[{\"name\":\"张三\",\"age\":\"15\",\"phone\":\"123456\"},\n" +
 
                "         {\"name\":\"李四\",\"age\":\"16\",\"phone\":\"78945\"}]\n" +
 
                "}";
 
JSONObject strJson = JSONObject.parseObject(str);//字符串转json对象
String people = String.valueOf(strJson.getJSONArray("people"));
List<Map<String, String>> list = (List<Map<String, String>>) JSONArray.parse(people);

 

参考文章:JSONObject详解(com.alibaba)-fastjson2_com.alibaba.fastjson2-CSDN博客

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

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

相关文章

「年终总结」生成人工智能的奇妙年份

自我介绍 做一个简单介绍&#xff0c;酒架年近48 &#xff0c;有20多年IT工作经历&#xff0c;目前在一家500强做企业架构&#xff0e;因为工作需要&#xff0c;另外也因为兴趣涉猎比较广&#xff0c;为了自己学习建立了三个博客&#xff0c;分别是【全球IT瞭望】&#xff0c;【…

MySQL之复合查询

单表查询回顾 在讲解多表查询前&#xff0c;我们先回顾一下单表查询&#xff0c;这是因为多表查询本质上依然是单表查询&#xff08;其原因在下文中讲解多表查询时再说明&#xff09;&#xff0c;只要掌握了单表查询&#xff0c;那么想掌握多表查询是非常简单的。 在<<…

【Electron】富文本编辑器之文本粘贴

由于这个问题导致&#xff0c;从其他地方复制来的内容 粘贴发送之后都会多一个 换行 在发送的时候如果直接&#xff0c;发送innerHTML 就 可以解决 Electron h5 Andriod 都没问题&#xff0c;但是 公司的 IOS 端 不支持&#xff0c;且不提供支持&#xff08;做不了。&#xff…

2023年华为OD机试(python)B卷-符合要求的结对方式

一、题目 题目描述&#xff1a; 用一个数组A代表程序员的工作能力&#xff0c;公司想通过结对编程的方式提高员工的能力&#xff0c;假设结对后的能力为两个员工的能力之和&#xff0c;求一共有多少种结对方式使结对后能力为N。 二、输入输出 输入描述: 5 1 2 2 2 3 4 第一行为…

个人用户免费,亚马逊正式推出 AI 编程服务 CodeWhisperer

亚马逊于 2022 年 6 月以预览版的形式&#xff0c;推出了 AI 辅助编程服务 CodeWhisperer。2023年4月18日&#xff0c;亚马逊云科技宣布&#xff0c;实时 AI 编程助手 Amazon CodeWhisperer 正式可用&#xff0c;同时推出的还有供所有开发人员免费使用的个人版&#xff08;Code…

深入理解Mysql MHA高可用集群搭建:从实验到实战

1. 简介 MHA&#xff08;Master High Availability&#xff09;是一个高效的开源MySQL高可用性解决方案。由日本开发者yoshinorim&#xff08;前DeNA员工&#xff0c;现在Facebook&#xff09;创建&#xff0c;MHA支持MySQL的主从复制架构&#xff0c;自动化主节点故障转移。当…

Lunix的奇妙冒险————权限篇

文章目录 一.什么是权限二.用户权限和类别。1.用户2.角色3.更换文件角色 三.文件的类别和对应权限1.文件的类别。2.文件属性权限1.权限说明。2.默认生成文件权限来源3.更改权限 3.文件的执行与删除 四.不同用户共同在一个目录下的权限。1.普通用户家目录2.在同一目录下文件的权…

springcloud中使用openfeign来优化接口调用

简单介绍在springcloud中使用openfeign来优化接口调用 目录 一、引入依赖二、为服务提供者编写openfeign接口三、服务消费者调用定义的openfeign接口四、项目结构五、日志级别配置1、通过配置类进行全局配置2、通过配置类进行局部配置3、通过配置文件配置 一、引入依赖 <!-…

工业信息采集平台 软件界面介绍

关键字&#xff1a;蓝鹏测控典型界面,蓝鹏测控交互界面,蓝鹏测控图形界面,蓝鹏测控历史界面,蓝鹏测控自定义界面 软件测控平台对UI程序界面&#xff0c;实现形式没有要求&#xff0c;也就是说&#xff0c;客户可以根据自己的需要设计任何样式的交互界面。 &#xff08;1&…

大数据前馈神经网络解密:深入理解人工智能的基石

文章目录 大数据前馈神经网络解密&#xff1a;深入理解人工智能的基石一、前馈神经网络概述什么是前馈神经网络前馈神经网络的工作原理应用场景及优缺点 二、前馈神经网络的基本结构输入层、隐藏层和输出层激活函数的选择与作用网络权重和偏置 三、前馈神经网络的训练方法损失函…

突破PHP disable_functions方法

1. 利用 LD_PRELOAD 环境变量 知识扫盲 LD_PRELOAD&#xff1a;是Linux系统的一个环境变量&#xff0c;它指定的*.so文件会在程序本身的*.so文件之前被加载。putenv()&#xff1a;PHP函数&#xff0c;可以设置环境变量mail()&#xff0c;error_log()&#xff1a;PHP函数&…

ERROR: No matching distribution found for torch==2.0.1解决方案

大家好&#xff0c;我是水滴~~ 本文主要介绍在安装 stable-diffusion-webui 时出现的 ERROR: No matching distribution found for torch2.0.1 问题的解决方案&#xff0c;希望能对你有所帮助。 《Python入门核心技术》专栏总目录・点这里 文章目录 问题描述解决方案离线安装 …

基于ssm潍坊理工学院就业信息网的设计与实现论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本潍坊理工学院就业信息网就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数…

VSCode安装Go环境

VSCode安装Go 1.点击Go官网&#xff0c;根据自己环境下载go安装包&#xff0c;我这里为Windows 2.双击安装包&#xff0c;一直点击【Next】即可 VSCode配置Go基础环境 1.创建Go的工作目录: C:\Code\GoCode 2.创建Go的环境变量: GOPATH (1)右键【此电脑】&#xff0c;点击…

什么是骨传导耳机?骨传导能保护听力吗?

骨传导耳机是一种非常特殊的蓝牙耳机&#xff0c;它通过骨传导技术将声音直接传送到内耳。这种技术不同于传统耳机&#xff0c;它不通过空气传送声音&#xff0c;而是通过头骨的振动来传送声音。 并且骨传导耳机能够在一定程度上起到保护听力的作用&#xff0c;主要是因为它们不…

春款来啦~我先冲了

这款假两件设计的连帽风衣外套 宽松版型对身材包容性很强&#xff0c;韩系慵懒风颜色很舒服 时尚百搭怎么穿都好看系列 做了腰部可调节抽绳&#xff0c;想要修身一点的可以自己调节哈 袖口处也做了金属按扣调节&#xff0c;防风保暖 这件风衣也很好搭配&#xff0c;很经典…

PICKIT3下载器脱机烧写指导书

一&#xff0c; PICKIT3的联机烧写方法 PICKIT3的联机烧写与ICD2一致&#xff0c;只是需要在MPLAB IDEV840或者更高版本下使用PICKIT3。烧写时&#xff0c;从MPLAB IDE的菜单“PROGRAMMER——PICKIT3”&#xff0c;选中PICKIT3即可。 由于PICKIT3能提供的烧写电流比较小&#…

微软CEO纳德拉当选2023年度CEO,AI大模型崛起成重要趋势;Mixtral 8x7B 真的击败了 GPT 3.5 Turbo 吗?

&#x1f989; AI新闻 &#x1f680; 微软CEO纳德拉当选2023年度CEO&#xff0c;AI大模型崛起成重要趋势 摘要&#xff1a;2023年被认为是AI大模型崛起之年&#xff0c;微软CEO纳德拉凭借对AI的投资和领导力当选2023年度CEO。纳德拉将AI技术融入微软的产品和服务中&#xff0…

gin框架使用系列之四——json和protobuf的渲染

系列目录 《gin框架使用系列之一——快速启动和url分组》《gin框架使用系列之二——uri占位符和占位符变量的获取》《gin框架使用系列之三——获取表单数据》 上篇我们介绍了如何获取数据&#xff0c;本篇我们介绍一下如何返回固定格式的数据。 一、返回JSON数据 在web开发中…

Vue监听浏览器自带的复制事件并对复制内容进行修改

场景&#xff1a; 在使用鼠标右键或者ctrl c的时候。光标会自动换行。粘贴出来的数据光标应该在红色部分&#xff0c;却出现在了黑色部分。 方法一&#xff1a; html标签不要换行&#xff1b;css去除空格&#xff1b; white-space: nowrap;方法二&#xff1a; 使用函数对复…