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

article/2025/9/26 21:19:02

文章目录

  • 前言
  • 一、什么是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对象转换成StringString 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对象转换成StringString 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://chatgpt.dhexx.cn/article/rgJSx4Ab.shtml

相关文章

将嵌套的json对象转化为json数组(python列表推导式)

需求说明 想将一个json文件录入MongoDB&#xff0c;如下图所示。 但是原文件是嵌套json对象的形式&#xff0c;如果直接导入MongoDB&#xff0c;会整体变成一个Document&#xff1a; 注&#xff1a;MongoDB中的Document相当于SQL中Row的概念。 而我希望一个Document对应一个…

Oracle 基础总结:日期函数专题

Oracle 基础总结&#xff1a;日期函数专题 日期函数:1、SYSDATE2、日期函数&#xff1a;(1&#xff09; MONTHS_BETWEEN&#xff08;日期1&#xff0c;日期2&#xff09;&#xff1a;返回两个日期相差的月数。(2&#xff09; ADD_MONTHS&#xff08;日期&#xff0c;数值&#…

numtodsinterval mysql用法_Oracle函数 - 日期函数详解

Oracle中的时间类型只有date和TIMESTAMP&#xff0c;TIMESTAMP是比date更精确的类型。日期时间函数用于处理时间类型的数据&#xff0c;Oracle以7位数字格式来存放日期数据&#xff0c;包括世纪、年、月、日、小时、分钟、秒&#xff0c;并且默认日期显式格式为“DD-MON-YY”。…

常用Oracle日期函数及聚合函数

1、常用Oracle日期函数 &#xff08;1&#xff09;CURRENT_DATE CURRENT_DATE是一个SQL标准函数&#xff0c;返回当前日期&#xff08;不带时间&#xff09;&#xff0c;可以在SELECT语句中使用。例如&#xff1a; 1 SELECT CURRENT_DATE FROM DUAL; 返回当前日期&#xff…

Oracle数据库之日期函数

今天给大家介绍一下oracle数据中的日期函数的用法。废话不多说&#xff0c;我们看一下oracle给我们提供了那些函数&#xff1f; 1.sysdate   用途&#xff1a;获取当前系统时间。 2.to_date(字符类型,日期类型) 用途&#xff1a;将字符类型转化成日期类型的函数&#xff0c;…

Oracle日期函数总结

1.日期和字符转换函数用法&#xff1a;&#xff08;to_char,to_date&#xff0c;to_namber&#xff09; 使用to_date函数将字符转换成数字。 使用to_char函数对日期的转换&#xff0c;并也可以对数字转换。 使用to_namber函数将字符转换成日期 格式&#xff1a;必须包含在单…

ORACLE之日期函数

日期函数&#xff1a; 运算规律&#xff1a; 日期数字 日期 日期-数字 日期 日期-日期 数字&#xff08;天数&#xff09; -- 查询当前日期&#xff1a; SELECT SYSDATE FROM DUAL;-- 查询一百天前的日期时间 SELECT (SYSDATE-100) FROM DUAL; -- 在指定日期上加上指定月数…

Oracle函数--日期函数

3.日期函数 months_between,add_months,next_day,last_day,round,trunc&#xff0c;sysdate sysdate关键字&#xff0c;表示系统的当前时间 select sysdate from dual; 结果&#xff1a;2022/5/4 12:38:4 select sysdate1 from dual; 当前时间加1天 结果&#xff1a;202…

Oracle 日期时间函数详解

文章目录 1 日期函数2 日期格式3 类型转换 1 日期函数 1. 常用日期函数(1) add_months(date, n) : n 个月前&#xff0c;-n 个月后(2) months_between(date1, date2) : 月份差 date1 - date22. 时区&#xff08;了解即可&#xff09;(1) select dbtimezone from dual;…

Oracle日期函数和转换函数

一、日期函数 日期函数用于处理date类型的数据&#xff0c;两个日期相减返回日期之间相差的天数。日期不允许做加法运算&#xff0c;无意义。 常见代表符号&#xff1a;yyyy 年&#xff0c;mm 月&#xff0c;dd 日&#xff0c;hh 小时&#xff0c;mi 分钟&#xff0c;ss 秒&…

Oracle 日期时间函数大全

前言 设置日期语言 alter session set NLS_DATE_LANGUAGEAMERICAN;alter session set NLS_DATE_LANGUAGESIMPLIFIED CHINESE; --也可以这样写&#xff1a;to_date(2021-06-30 15:23:45,yyyy-mm-dd hh24:mi:ss,NLS_DATE_LANGUAGEAMERICAN ) 可通过如下语句查看&#xff1a; se…

这12类Oracle日期函数,全都给你总结了

在使用Oracle数据库过程中&#xff0c;对日期的使用不可避免&#xff0c;那Oracle中的日期函数有哪些呢&#xff1f;本篇就日期函数进行整理了&#xff0c;不一定全部了解记住&#xff0c;但是要做到心中有数&#xff0c;以后在写脚本的时候就不会绕弯子了。 1、sysdate、curr…

Oracle日期函数

Oracle日期类型函数是操作日期、时间类型的相关数据&#xff0c;返回日期时间类型或数字类型结果&#xff0c;常用的函数有&#xff1a;SYSDATE()、ADD_MONTHS&#xff08;&#xff09;、LAST_DAY&#xff08;&#xff09;、TRUNC()、ROUND()等等。 系统日期、时间函数 SYSDAT…

Oracle函数——日期函数

Oracle中的时间类型只有date和TIMESTAMP&#xff0c;TIMESTAMP是比date更精确的类型。日期时间函数用于处理时间类型的数据&#xff0c;Oracle以7位数字格式来存放日期数据&#xff0c;包括世纪、年、月、日、小时、分钟、秒&#xff0c;并且默认日期显式格式为“DD-MON-YY”。…

回归问题的评价指标

回归问题的评价指标有很多&#xff0c;这里一一进行详细分类&#xff1a; 点对点误差 MSE均方误差 MSE(Mean Square Error)&#xff1a; 均方误差描述了样本真实值与预测值差方求和的平均值&#xff0c;在机器学习中&#xff0c;利用均方误差最小化优化模型的方法称…

区分回归问题和分类问题

回归问题和分类问题的区别 回归问题 用一个经典的问题来解释&#xff1a;假设你想买房子&#xff0c;手头上仅有的是之前出售的房子的占地面积大小和房子的价格&#xff0c;你想凭借手头上的这些数据来买一套不错的房子&#xff0c;那么你仅有的关于房子的信息是房子的占地大小…

LSTM回归问题

LSTM 解决回归问题时&#xff0c;出现了 model.predict() 输出的值几乎是常数值的问题&#xff0c;后来发现是因为数据没有标准化&#xff08;归一化&#xff09;&#xff0c;导致 loss 不下降&#xff0c;也就是不收敛。后来加入了数据的标准化之后&#xff0c;就可以拟合了。…

数据分析——随机森林解决回归问题

下表为训练数据集&#xff0c;特征向量只有一维&#xff0c;根据此数据表建立回归决策树。 在本数据集中&#xff0c;只有一个特征变量&#xff0c;最优切分变量自然是x。接下来考虑9个切分点{1.5,2.5,3.5,4.5,5.5,6.5,7.5,8.5,9.5}&#xff0c;根据下式计算每个待切分点的损失…

处理回归问题常见的算法

7.处理回归问题常见的算法&#xff1a; 回归属于有监督学习的一种&#xff0c;其从连续的统计数据中的到数学模型&#xff0c;然后使用生成的模型用于预测和分类。线性回归&#xff1a;给定数据集&#xff0c;其中线性回归模型通过对数据集的学习生成一个线性模型&#xff0c;…

深度学习 分类问题与回归问题

分类问题与回归问题 分类与回归 一、分类问题1.1分类性能度量&#xff1a;&#xff08;1&#xff09;准确率&#xff08;accuracy&#xff09;*&#xff08;2&#xff09;精确率&#xff08;percision&#xff09;*&#xff08;3&#xff09;召回率&#xff08;recall&#xff…