Java如何解析JSON字符串(复杂json解析详解)

如果是springboot工程中解析JSON字符串请点击下面链接:

https://blog.csdn.net/tangshiyilang/article/details/134275828

如果不是springboot工程或项目中使用的fastjson请继续向下看

1、什么是JSON字符串?

我们在理解json的时候,不必要过分的解读json到底是哪几个字母的简称,要了解本质。

JSON的本质就是字符串,字符串几乎所有的系统都支持,所以json的兼容性好。

JSON就是一种数据的承载方式,可用于不同平台之间的数据交互类型,因为几乎所有的语言都支持JSON的创建和解析。

如:Java是面向对象的,C是面向过程的,如何Java发送一个对象给C,C就不能够识别什么是对象,或者识别的代价特别的大。

2、JSON字符串的格式?

简单的JSON字符串:{"key":"value","key":"value"......} 如:{"id":"1001","name":"晓春","sex":"男"}

JSON数组:[{"key":"value","key":"value"......},{},{}]

复杂的JSON字符串:值本身还是一个json字符串, 如:{"id":"1001","name":"晓春","sex":"男","hobby":{"hobby1":"游泳","hobby2":"打篮球"}},我们能够发现hobby对应的值依旧是一个json字符串({"hobby1":"游泳","hobby2":"打篮球"}),这种就是复杂的json字符串。

3、JSON字符串的解析方式?

我们使用官方提供的JSONArray与JSONObject

第一步:导入相关的包,包我放在了百度云盘中,可以通过如下地址下载

20210812095755485.png

链接:https://pan.baidu.com/s/1FQ6pDlYzwmhmViXcN9PZ6Q
提取码:ocfz

第二步:创建如下复杂的json字符串

String  params="{'students':[{'stu_id':'1001','stu_name':'十一郎'},"
		+ "{'stu_id':'1002','stu_name':'十二郎'}],'flag':'1',"
		+ "'teacher':{'tea_id':'2001','tea_name':'晓春'}}";

说明:解析的时候会出现三种类型的数据,字符串类型的flag,Student对象和Teacher对象,所以需要创建Student对象和Teacher对象,具体创建如下:

第三步:创建Student和Teacher对象

说明:需要设置属性的set和get方法及有参数和无参数的构造器

public class Student {
   private String stu_id;
   private String stu_name;
public String getStu_id() {
	return stu_id;
}
public void setStu_id(String stu_id) {
	this.stu_id = stu_id;
}
public String getStu_name() {
	return stu_name;
}
public void setStu_name(String stu_name) {
	this.stu_name = stu_name;
}
public Student(String stu_id, String stu_name) {
	super();
	this.stu_id = stu_id;
	this.stu_name = stu_name;
}
public Student() {
	super();
	// TODO Auto-generated constructor stub
}
   
   
}

public class Teacher {
   private String tea_id;
   private String tea_name;
public String getTea_id() {
	return tea_id;
}
public void setTea_id(String tea_id) {
	this.tea_id = tea_id;
}
public String getTea_name() {
	return tea_name;
}
public void setTea_name(String tea_name) {
	this.tea_name = tea_name;
}
public Teacher(String tea_id, String tea_name) {
	super();
	this.tea_id = tea_id;
	this.tea_name = tea_name;
}
public Teacher() {
	super();
	// TODO Auto-generated constructor stub
}

}

 第四步:具体解析步骤如下

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

public class Test {
	public static void main(String[] args) {
		
		//{"id":"1001","name":"晓春","sex":"男","hobby":{"hobby1":"游泳","hobby2":"打篮球"}}
		
		String  params="{'students':[{'stu_id':'1001','stu_name':'十一郎'},"
				+ "{'stu_id':'1002','stu_name':'十二郎'}],'flag':'1',"
				+ "'teacher':{'tea_id':'2001','tea_name':'晓春'}}";
		
		   //通过fromObject将json字符串翻译成JSON对象(JSONObject)
		   JSONObject jsonObject = JSONObject.fromObject(params);
		   //假如返回值为简单的类型,也就是单个值,使用getString("key")获取
		   String flag=jsonObject.getString("flag");//结果就是简单的值类型
		   System.out.println("===flag值为==="+flag);
		   
		   //如果结果是一个json对象,使用getJSONObject("key")
		   JSONObject teacherObject=jsonObject.getJSONObject("teacher");
		   //通过toBean方法将json字符串翻译成java中的Teaher对象并打印出结果
		   Teacher tea = (Teacher) JSONObject.toBean(teacherObject, Teacher.class);
		   System.out.println("=====老师的名字====="+tea.getTea_name());
		   
		   //如果返回值为多个对象组成的json数组,使用getJSONArray("key")
		   //上面的students类型就是json数组如:students:[{},{},{}]
		   JSONArray studentsjsonArray = jsonObject.getJSONArray("students");//返回的是非单一的json对象
		   //通过循环遍历数据
		   for (int i=0;i<studentsjsonArray.length();i++) {
			   //将获取的单个json字符串翻译成JSONObject
			   JSONObject a=JSONObject.fromObject(studentsjsonArray.get(i).toString());
			   //将json对象翻译成Student对象
			   Student stu = (Student) JSONObject.toBean(a, Student.class);
			   //打印出学生的姓名
			   System.out.println("=====学生姓名====="+stu.getStu_name());   
		   }
	}
}

打印结果如下:

===flag值为===1
=====老师的名字=====晓春
=====学生姓名=====十一郎
=====学生姓名=====十二郎

4、其他解释

a、JSONArray常见方法 

fromArray(Object[] array):通过一个array数组创建JSONArray对象

fromCollection(Collection collection):通过collection集合对象创建JSONArray对象

fromString(String string):通过一个json格式的字符串构造一个JSONArray对象

toString():把JSONArray对象转换为json格式的字符串

b、JSONObject常见方法 

fromBean(Object bean):通过一个对象创建一个JSONObject对象

fromJSONObject(JSONObject object):通过另外一个JSONObject对象构造一个JSONObject对象

fromJSONString(JSONString string:通过一个JSONString创建一个JSONObject对象

toString():把JSONObject对象转换为json格式的字符串

要将JSON字符串转换为实体对象,可以使用JSON库提供的方法来实现。你可以先将JSON字符串转换为JSON对象,然后使用JSON对象提供的方法来获取和设置实体对象的属性。 首先,你需要导入JSON库,比如FastJSON或者Gson。然后,你可以按照以下步骤进行操作: 1. 将JSON字符串转换为JSON对象。根据引用中的代码示例,你可以使用JSON库提供的`JSONObject.parseObject()`方法将JSON字符串转换为JSON对象。 ```java String jsonStr = "{\"test\":\"test\",\"Result\":[{\"Detail1\":\"Detail1\",\"Result1\":\"Result1\"},{\"Detail2\":\"Detail2\",\"Result2\":\"Result2\"},{\"Detail3\":\"Detail3\",\"Result3\":\"Result3\"}]}"; JSONObject jsonObject = JSONObject.parseObject(jsonStr); ``` 2. 创建实体类对象。你需要根据实体类的定义,创建一个对应的Java对象。 例如,假设你的实体类是`MyEntity`,包含属性`test`和`result`,那么你可以在代码中创建一个`MyEntity`对象。 ```java MyEntity myEntity = new MyEntity(); ``` 3. 从JSON对象中获取属性值并设置给实体对象。根据引用中的代码示例,你可以使用JSON对象提供的`getString()`等方法来获取属性值,并将其设置给实体对象的对应属性。 ```java String testStr = jsonObject.getString("test"); myEntity.setTest(testStr); ``` 最后,你就得到了一个包含从JSON字符串转换而来的实体对象`myEntity`。 需要注意的是,你需要根据你的实际情况来定义实体类以及设置属性的方式,这里只是一个示例。另外,使用的JSON库和具体的实体类定义可能会有所不同,所以请参考你所使用的JSON库的文档来获得更详细的信息。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [将json字符串与实体类互相转换](https://blog.csdn.net/weixin_45583303/article/details/127192075)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* [JSON字符串JSON对象相互转化实例详解](https://download.csdn.net/download/weixin_38614484/13205956)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雾林小妖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值