Java利用fastjson解析复杂嵌套json字符串、json数组;json字符串转Java对象,json数组转list数组

news2025/7/9 9:28:44

文章目录

  • 前言
  • 一、什么是JSON对象?
  • 二、什么是json字符串?
  • 二、什么是JSON数组?
  • 三、复杂、嵌套的json字符串
  • 四、json字符串转换
    • 4.1 简单json字符串转换为java对象
    • 4.2 简单json字符串数组转换为list数组
    • 4.3 复杂嵌套json字符串数组转换为Java对象、list数组
      • 4.3.1 示例1
      • 4.3.2 示例2
  • 总结


前言

在开发中经常需要将json字符串转换为java对象或者list数组,这样方便我们来使用这些数据,下面就来介绍一下怎样将json字符串和json数组转换为Java对象或者list数组。

本次使用阿里巴巴的fastjson来解析json字符串,需要添加依赖:

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.8</version>
        </dependency>

一、什么是JSON对象?

在大括号 {…} 中书写,包含多个 key/value(键/值)对,key 必须是字符串,value 可以是合法的 JSON 数据类型(字符串, 数字, 对象, 数组, 布尔值或 null)
例如一个最简单的没有嵌套的JSON对象:
{ “name”:“Sun”, “age”:18, “site”:null }

二、什么是json字符串?

书写格式和JSON对象一样,不过类型属于String,不能直接操作其中的各个属性,需要对其进行转换。在很多前后端交互传值之类的,都以json字符串的形式进行传递。,所以对json字符串进行转换非常有必要。

二、什么是JSON数组?

JSON 数组在中括号中书写,JSON 中数组值必须是合法的 JSON 数据类型(字符串, 数字, 对象, 数组, 布尔值或 null)。
简单的JSON数组:
[ “Google”, “Runoob”, “Taobao” ]

三、复杂、嵌套的json字符串

复杂的是json字符串里面嵌套json数组,这也是转换的重点,例如:
{
“student”: [
{
“name”: “Tom”,
“Grade”: 1,
“age”: 11,
“gender”: “M”
},
{
“name”: “Jerry”,
“Grade”: 1,
“age”: 10,
“gender”: “M”
}
],
“classroom”: {
“class1”: “room1”,
“class2”: “room2”
}
}
在这里插入图片描述

在这里推荐几个比较好用的json字符串校验和格式化的网站:
链接: http://www.kjson.com/
链接: https://www.bejson.com/

四、json字符串转换

4.1 简单json字符串转换为java对象

转换语句:

//方法1  将json字符串转换为java对象
Student student =JSON.parseObject(jsonStr,Student .class);
//方法2   先将json字符串转换成JSONObject对象
JSONObject jsonObject1 = new JSONObject(JSON.parseObject(jsonStr));
//将转换后的JSONObject对象转换成Student对象
Student  student1 = (Student) JSONObject.toJavaObject(jsonObject1,Student.class);

示例:解析如下json字符串
{
“name”: “Tom”,
“Grade”: 1,
“age”: 11,
“gender”: “M”
}
在这里插入图片描述

    首先创建一个对应的对象:
public class Student {
    private String name;
    private int grade;
    private int age;
    private String gender;
    //省略get、set方法
}
    public void testJson(){
        String jsonStr = "{\n" +
                "            \"name\": \"Tom\", \n" +
                "            \"Grade\": 1, \n" +
                "            \"age\": 11, \n" +
                "            \"gender\": \"M\"\n" +
                "        }";
        JSONObject jsonObject = new JSONObject(JSON.parseObject(jsonStr));
        System.out.println("jsonObject:"+jsonObject);
        System.out.println("name:"+jsonObject.get("name"));
        System.out.println("Grade:"+jsonObject.get("Grade"));
        System.out.println("age:"+jsonObject.get("age"));

        //方法1  将json字符串转换为java对象
        Student student =JSON.parseObject(jsonStr,Student .class);
        System.out.println("student:"+student);

        //方法2   先将json字符串转换成JSONObject对象
        JSONObject jsonObject1 = new JSONObject(JSON.parseObject(jsonStr));
        //将转换后的JSONObject对象转换成Student对象
        Student  student1 = (Student) JSONObject.toJavaObject(jsonObject1,Student.class);
        System.out.println("student1:"+student1);
        //转换为java对象之后可以利用对象的get方法来取值
        System.out.println("age:"+student.getAge());
    }

执行结果:
在这里插入图片描述

4.2 简单json字符串数组转换为list数组

使用语句:

 List<Student> studentList  = JSONObject.parseArray(jsonStr, Student.class);

示例:

[
{
“name”: “Tom”,
“Grade”: 1,
“age”: 11,
“gender”: “M”
},
{
“name”: “Jerry”,
“Grade”: 1,
“age”: 10,
“gender”: “M”
}
]
在这里插入图片描述

首先创建一个对应的java对象:

public class Student {
    private String name;
    private int grade;
    private int age;
    private String gender;
    //省略get、set方法
}
    public void testJson(){
        String jsonStr = "[\n" +
                "    {\n" +
                "        \"name\": \"Tom\", \n" +
                "        \"Grade\": 1, \n" +
                "        \"age\": 11, \n" +
                "        \"gender\": \"M\"\n" +
                "    }, \n" +
                "    {\n" +
                "        \"name\": \"Jerry\", \n" +
                "        \"Grade\": 1, \n" +
                "        \"age\": 10, \n" +
                "        \"gender\": \"M\"\n" +
                "    }\n" +
                "]";
        List<Student> studentList  = JSONObject.parseArray(jsonStr, Student.class);
        System.out.println("studentList:"+studentList);

        for (int i = 0; i < studentList.size(); i++) {
            System.out.println("name:"+studentList.get(i).getName());
            System.out.println("Grade:"+studentList.get(i).getGender());
            System.out.println("age:"+studentList.get(i).getAge());
        }
    }

运行结果:
在这里插入图片描述

4.3 复杂嵌套json字符串数组转换为Java对象、list数组

4.3.1 示例1

使用语句:
为4.1和4.2的嵌套使用

示例:
{
“student”: [
{
“name”: “Tom”,
“Grade”: 1,
“age”: 11,
“gender”: “M”
},
{
“name”: “Jerry”,
“Grade”: 1,
“age”: 10,
“gender”: “M”
}
],
“classroom”: {
“class1”: “fifth floor”,
“class2”: “seventh floor”
}
}
在这里插入图片描述

首先创建对应的java对象,上面的Student对象可以重复使用,这里需要再添加两个对象,一个整体的包含Student和Classroom的对象School ,一个Classroom对象:

public class School {
	//这里的Student和Classroom声明为Object类型
    private Object Student;
    private Object Classroom;
         //省略get、set方法
}
public class Classroom {
    private String class1;
    private String class2;
      //省略get、set方法
}

进行转换:

    public void testJson(){
        String jsonStr = "{\n" +
                "    \"student\": [\n" +
                "        {\n" +
                "            \"name\": \"Tom\", \n" +
                "            \"Grade\": 1, \n" +
                "            \"age\": 11, \n" +
                "            \"gender\": \"M\"\n" +
                "        }, \n" +
                "        {\n" +
                "            \"name\": \"Jerry\", \n" +
                "            \"Grade\": 1, \n" +
                "            \"age\": 10, \n" +
                "            \"gender\": \"M\"\n" +
                "        }\n" +
                "    ], \n" +
                "    \"classroom\": {\n" +
                "        \"class1\": \"fifth floor\", \n" +
                "        \"class2\": \"seventh floor\"\n" +
                "    }\n" +
                "}";
        //方法1   调用JSON.parseObject方法将json字符串转换为java对象
        School school =JSON.parseObject(jsonStr,School.class);
        System.out.println("school:"+school);
        
        //方法2   先将json字符串转换成JSONObject对象
        JSONObject jsonObject = new JSONObject(JSON.parseObject(jsonStr));
        //将转换后的JSONObject对象整体转换成School对象
        School school1 = (School) JSONObject.toJavaObject(jsonObject,School.class);
        System.out.println("school1:"+school1);

        //将School中的student数组转换成list对象
        List<Student> studentList  = JSONObject.parseArray(school.getStudent().toString(), Student.class);
        System.out.println("studentList:"+studentList);
        for (int i = 0; i < studentList.size(); i++) {
            System.out.print("name:"+studentList.get(i).getName()+",");
            System.out.print("Grade:"+studentList.get(i).getGender()+",");
            System.out.println("age:"+studentList.get(i).getAge());
        }
        //将School中的classroom转换成java对象 与刚开始转换school的思路是一样的
        //从school对象中getClassroom,返回的是一个Object对象类型
        Object classroomObj = school.getClassroom();
        //用toString()方法将Object对象转换成String
        String strClassroom = school.getClassroom().toString();
        //方法1   调用JSON.parseObject方法将json字符串转换为java对象
        Classroom classroom1 =JSON.parseObject(strClassroom,Classroom.class);
        System.out.println("classroom1:"+classroom1);

        //方法2  先将json字符串转换成JSONObject对象
        JSONObject jsonClassroom = new JSONObject(JSON.parseObject(strClassroom));
        //再利用JSONObject.toJavaObject转换为java对象
        Classroom classroom2 = (Classroom) JSONObject.toJavaObject(jsonClassroom,Classroom.class);
        System.out.println("classroom2:"+classroom2);
    }

运行结果:
在这里插入图片描述

4.3.2 示例2

使用语句:
在4.3.1的基础上新增了两个字段:schoolName和address。Student对象和Classroom对象可以使用,需要重新创建一个整体的对象HighSchool

示例:
{
“schoolName”: “ECNU”,
“address”: “Road”,
“student”: [{
“name”: “Tom”,
“Grade”: 1,
“age”: 11,
“gender”: “M”
},
{
“name”: “Jerry”,
“Grade”: 1,
“age”: 10,
“gender”: “M”
}
],
“classroom”: {
“class1”: “fifth floor”,
“class2”: “seventh floor”
}
}
在这里插入图片描述

首先创建对应的java对象,上面的Student对象可以重复使用,这里需要再添加两个对象,一个整体的包含Student和Classroom的对象,一个Classroom对象:

public class School {
	//这里的Student和Classroom声明为Object类型
    private Object Student;
    private Object Classroom;
         //省略get、set方法
}
public class Classroom {
    private String class1;
    private String class2;
      //省略get、set方法
}

进行转换:

       public void testJson(){
        String jsonStr = "{\n" +
                "    \"schoolName\": \"ECNU\", \n" +
                "    \"address\": \"Road\", \n" +
                "    \"student\": [\n" +
                "        {\n" +
                "            \"name\": \"Tom\", \n" +
                "            \"Grade\": 1, \n" +
                "            \"age\": 11, \n" +
                "            \"gender\": \"M\"\n" +
                "        }, \n" +
                "        {\n" +
                "            \"name\": \"Jerry\", \n" +
                "            \"Grade\": 1, \n" +
                "            \"age\": 10, \n" +
                "            \"gender\": \"M\"\n" +
                "        }\n" +
                "    ], \n" +
                "    \"classroom\": {\n" +
                "        \"class1\": \"fifth floor\", \n" +
                "        \"class2\": \"seventh floor\"\n" +
                "    }\n" +
                "}";
        //方法1   调用JSON.parseObject方法将json字符串转换为java对象
        HighSchool highSchool = JSON.parseObject(jsonStr,HighSchool.class);
        System.out.println("highSchool:"+ highSchool);
        System.out.println("schoolName:"+ highSchool.getSchoolName());
        System.out.println("address:"+ highSchool.getAddress());
        //方法2 与之前讲过的一样,这里就省略掉了

        //将School中的student数组转换成list对象
        List<Student> studentList  = JSONObject.parseArray(highSchool.getStudent().toString(), Student.class);
        System.out.println("studentList:"+studentList);
        for (int i = 0; i < studentList.size(); i++) {
            System.out.print("name:"+studentList.get(i).getName()+",");
            System.out.print("Grade:"+studentList.get(i).getGender()+",");
            System.out.println("age:"+studentList.get(i).getAge());
        }
        //HighSchool 与刚开始转换school的思路是一样的
        //从highSchool对象中getClassroom,返回的是一个Object对象类型
        Object classroomObj = highSchool.getClassroom();
        //用toString()方法将Object对象转换成String
        String strClassroom = highSchool.getClassroom().toString();
        //方法1   调用JSON.parseObject方法将json字符串转换为java对象
        Classroom classroom1 =JSON.parseObject(strClassroom,Classroom.class);
        System.out.println("classroom1:"+classroom1);

        //方法2 与之前讲过的一样,这里就省略掉了
    }

运行结果:
在这里插入图片描述


总结

转换大体上分为两种:
1、以{……}大括号包裹的数据要转换为java对象;
2、 以[ ] 中括号包裹的数据转换为list数组。

首先要明白,以 { } 开头的是JSONObject,以 [ ] 开头的是JSONArray,如果本身就是json字符串的格式(即格式类型为String),那就不用转换,直接使用转换方法进行转换。

但是如果是嵌套字符串的话,从第一次转换后的java对象中取出来的是Object类型,这时候需要先用toString方法转换为String类型,然后再调用方法。

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

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

相关文章

十大常用web前端UI组件库,赶紧收藏

今天主要介绍web前端常用的UI库&#xff0c;这些网站基本都是背靠互联网大厂&#xff0c;值得web前端开发者收藏&#xff0c;当然还是要多多学习使用。 Vant 一款有赞出品轻量、可靠的的移动UI组件库&#xff0c;目前支持 Vue2、Vue3、React&#xff0c;微信和支付宝小程序&a…

Vue基础语法知识(自用,完整版)

Vue基础语法知识 1、想让Vue工作&#xff0c;就必须创建一个Vue实例&#xff0c;且要传入一个配置对象 2、root容器里的代码依然符合html规范&#xff0c;只不过混入了一些特殊的Vue语法 3、root容器中里的代码被称为【Vue模板】 4、Vue实例和容器是一一对应的 5、真实开发…

手机+PC电脑如何使用油猴插件和油猴脚本?

一、移动端使用油猴脚本 移动端可以不使用油猴插件&#xff0c;就可直接安装脚本&#xff08;需要浏览器支持&#xff09;&#xff0c;这样天然支持油猴脚本的移动浏览器还是很多&#xff0c;比如&#xff1a;书签地球、X浏览去、M浏览器等&#xff0c;但是各个浏览器的支持情…

前端Vue项目部署到服务器过程,以及踩坑记录

目录 需求 过程 踩坑 nginx服务器404错误的原因 404 Not Found nginx服务器500错误的原因 500 Internal Server Error nginx反向代理 需求 前后端完成项目后&#xff0c;需要部署到本地的服务器上。 第一次部署&#xff0c;以下是从0开始慢慢学着弄的详细过程 过程 …

大白话理解-微信小程序获取授权

学习目录 微信小程序前端直接获取授权微信为什么要授权微信怎么授权?微信登录微信小程序前端直接获取授权 微信为什么要授权 微信用户授权,才可以操作微信官方的某些接口。简单来说就是:微信定义了很多接口,然后他们认为有一部分是涉及到用户使用安全的,所以把这一部分划…

Python 爬虫案例

一、用cookie池模拟登录 在网络请求交互中&#xff0c;为了维持用户的登录状态&#xff0c;引入了cookie的概念。当用户第一次登录某个网站时&#xff0c;网站服务器会返回维持登录状态需要用到的信息&#xff0c;这些信息就称为cookie。浏览器会将cookie信息保存在本地计算机…

微信小程序(分包)

文章目录分包概念作用分包后的项目构成分包的加载规则分包的体积限制配置方法小程序打包原则引用原则独立分包分包预下载分包 概念 分包指的是把一个完整的小程序项目&#xff0c;按照需求划分为不同的子包&#xff0c;在构建时打包成不同的分包&#xff0c;用户在使用时按需…

解决报错:Uncaught TypeError: Cannot read properties of undefined (reading ‘install‘)

在做vue2项目时出现如下错误&#xff0c;页面空白且控制台出现如下错误&#xff1a; 报错内容&#xff1a; Uncaught TypeError: Cannot read properties of undefined (reading install) at Vue.use (vue.runtime.esm.js?c320:5709:1) at eval (index.js?5aa4:7:1…

Http请求-hutool工具类的使用

Http请求-hutool工具类的使用 前言 在日常java后端开发的工作中经常会遇到后端发起HTTP请求的情况&#xff0c;这里可以使用一个简单的工具类。 官方网址&#xff1a;Http请求-HttpRequest (hutool.cn) 介绍 本质上&#xff0c;HttpUtil中的get和post工具方法都是HttpRequ…

【小程序从0到1】首页布局案例的实现

欢迎来到我的博客 &#x1f4d4;博主是一名大学在读本科生&#xff0c;主要学习方向是前端。 &#x1f36d;目前已经更新了【Vue】、【React–从基础到实战】、【TypeScript】等等系列专栏 &#x1f6e0;目前正在学习的是&#x1f525;React/小程序React/小程序React/小程序&am…

let、const和var的区别(涉及块级作用域)

let 、const和var的区别 let、const、var在js中都是用于声明变量的&#xff0c;在没有进行ES6的学习前&#xff0c;我基本只会使用到var关键字进行变量的声明&#xff0c;但在了解了ES6之后就涉及到了块级作用域以及let&#xff0c;const了。 let与const let是用于替代var来…

Java实现本地缓存、分布式缓存及多级缓存

以下均为自己参考其它博主文章或自己理解整理而成&#xff0c;如有错误之处&#xff0c;欢迎在评论区批评指正&#xff01; 0. 缓存简介 像MySql等传统的关系型数据库已经不能适用于所有的业务场景&#xff0c;比如电商系统的秒杀场景&#xff0c;APP首页的访问流量高峰场景&a…

火爆全网的人工智能真的有那么强嘛?

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#xff0c;全栈领域优质创作者。&#x1f61c;&#x1f4dd; 个人主页&#xff1a;馆主阿牛&#x1f525;&#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4d…

Element-UI中的表单验证

Element是一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组件库。   Element为vue-cli 准备了相应的 Element 插件&#xff0c;开发者可以用它们快速地搭建一个基于 Element 的项目&#xff0c;不仅能够快速体验交互细节&#xff0c;还可以使用前端框架封装的代…

Spring AOP 切面增强

背景背景&#xff1a;我们在开发过程中&#xff0c;经常需要做些周边功能&#xff1a; 性能统计、日志、事物管理。我们需要考虑如何解耦这些周边功能开发和核心业务开发区分开达到提升代码质量目的。定义在AOP思想里面定义周边功能定义是&#xff08;性能统计、日志、事务管理…

两种方案解决ERROR in Conflict: Multiple assets emit different content to the same filename index.html 的问题

Ⅰ、所遇问题简述&#xff1a; 1、问题描述&#xff1a; 在用 vue-cli 正常来创建新的基于 vue2 框架 的项目&#xff0c;在安装好 node-modules 之后&#xff0c;运行命令 ‘npm run serve’ ,报错情况如下&#xff1a; ERROR in Conflict: Multiple assets emit different…

用Pytorch构建第一个神经网络模型(附案例实战)

本文参加新星计划人工智能(Pytorch)赛道&#xff1a;https://bbs.csdn.net/topics/613989052 目录 一、Pytorch简介 二、实验过程 2.1数据集介绍 2.2加载数据 2.3数据预处理 2.3.1特征转换 2.3.2缺失值处理 2.3.3样本不平衡处理 2.4特征工程 2.4.1划分训练集和测试集 …

Unity 插件篇 ✨ | 受击插件Feel 详细教程,开发游戏时更好的操控 游戏打击感

&#x1f3ac; 博客主页&#xff1a;https://xiaoy.blog.csdn.net &#x1f3a5; 本文由 呆呆敲代码的小Y 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f384; 学习专栏推荐&#xff1a;Unity系统学习专栏 &#x1f332; 游戏制作专栏推荐&#xff1a;游戏制作 &…

同态加密详解

什么是同态加密 同态加密&#xff08;Homomorphic Encryption&#xff09;是指将原始数据经过同态加密后&#xff0c;对得到的密文进行特定的运算&#xff0c;然后将计算结果再进行同态解密后得到的明文等价于原始明文数据直接进行相同计算所得到的数据结果。 同态加密与一般加…

与C知道的第一次亲密接触

chatG.P.T没向大陆地区开放服务&#xff0c;如要注册除了要邮箱&#xff0c;还要一个已开放服务国家的电话号来接受验证&#xff0c;于是果断放弃注册。还好&#xff0c;CSDN官网提供过网页版的类似聊天机器人&#xff0c;现只在CSDN APP上才有入口。而且现在改名为“C知道”&a…