JSON4:嵌套的JsonObject与JSONArray的取值

本文详细介绍了如何处理并解析具有多层嵌套结构的JSON数据,通过Java代码实例展示了从外到内的分析方法,以及如何逐层获取所需数据。从简单的JSON对象开始,深入到嵌套的数组和对象,最终实现复杂数据结构的遍历与信息提取。

在复杂的JSON数据的格式中,往往会对JSON数据进行嵌套,这样取值会比之前的取值稍微复杂一点,但是只要思路清晰,其实取法还是一样的。就跟if else语句一样,如果if中套if,if中再套if,写的规范了还行,要是代码格式不规范,那我们肯定也看着麻烦。所以啊,对于json嵌套,只要记住符号“:”前是键,符号后是值大括号成对找,一层层剥开,就清楚了。 举个例子说明,如下:


从外到里看,例子中就是一个数组,数组里面是两个json格式的字符串。这样分析思路就清晰多了。

例如以下的嵌套JSON数据:

{
	    "resultcode":"200",
	    "reason":"成功的返回",
	    "result":{
		"company":"顺丰",
		"com":"sf",
		"no":"575677355677",
		"list":[
		    {
			"datetime":"2013-06-25 10:44:05",
			"remark":"已收件",
			"zone":"台州市"
		    },
		    {
			"datetime":"2013-06-25 11:05:21",
			"remark":"快件在 台州 ,准备送往下一站 台州集散中心 ",
			"zone":"台州市"
		    }
		],
		"status":1
	    },
	    "error_code":0
}
那么这种多重嵌套的JSON数据应该从何入手?

道理很简单,每一层都当作是一个简单JSON数据,我们来分析一下:

这里的嵌套JSON数据,我们可以先看第一层,其实就是如下:

{
     "resultcode":"200",
     "reason":"成功的返回",
     "error_code":0
}
那么第二层就是在第一层的里面,其实第二层也可以看做是单独的一层,可以看做是这样的:

{
   "result":{
	"company":"顺丰",
	"com":"sf",
	"no":"575677355677",
	"status":1
   }
} 
接下来最内的一层是JSONArray,对于这层,我们可以看成是数组的形式。

分析完上面复杂的JSON,知道怎么获取需要的值了吗?

根据分析的思路,我们来一一获取,JAVA代码如下:

package com.json;

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

public class JsonObjectAndJsonArrayDemo {
	public static void main(String[] args){
		//复杂的json数据
		String jsonStr = "{\"resultcode\":\"200\",\"reason\":\"成功的返回\",\"result\":{\"company\":\"顺丰\",\"com\":\"sf\","
				+ "\"no\":\"575677355677\",\"list\":[{\"datetime\":\"2013-06-25 10:44:05\",\"remark\":\"已收件\",\"zone\":\"台州市\"},"
				+ "{\"datetime\":\"2013-06-25 11:05:21\",\"remark\":\"快件在 台州 ,准备送往下一站 台州集散中心 \",\"zone\":\"台州市\"}],\"status\":1},"
				+ "\"error_code\":0}";
		JSONObject json = JSONObject.fromObject(jsonStr); //得到整个json串
		System.out.println("resultcode:"+json.getString("resultcode"));  //根据key得到value:200
		System.out.println("reason:"+json.getString("reason"));  //根据key得到value:成功的返回
		
		//当遇到result时,也是将它当成一个整体串
		System.out.println("company:"+JSONObject.fromObject(json.getString("result")).getString("company"));
		System.out.println("com:"+JSONObject.fromObject(json.getString("result")).getString("com"));
		System.out.println("no:"+JSONObject.fromObject(json.getString("result")).getString("no"));
		
		//当遇到再次嵌套时,此时的list是一个JSONArray,所以需要将其当作数组的形式处理,其实还是一个串
		//get(i)以下标为主,里面的东西,其实也是一个json的形式数据,你可以不看外面怎么嵌套,按道理只当成单单一个json串处理即可
		System.out.println("list(0).datetime:"+JSONObject.fromObject(JSONArray.fromObject(JSONObject.fromObject(json.getString("result")).getString("list")).get(0)).getString("datetime"));
		
		System.out.println("list(0).remark:"+JSONObject.fromObject(JSONArray.fromObject(JSONObject.fromObject(json.getString("result")).getString("list")).get(0)).getString("remark"));
		
		System.out.println("list(0).zone:"+JSONObject.fromObject(JSONArray.fromObject(JSONObject.fromObject(json.getString("result")).getString("list")).get(0)).getString("zone"));
		
		System.out.println("list(1).datetime:"+JSONObject.fromObject(JSONArray.fromObject(JSONObject.fromObject(json.getString("result")).getString("list")).get(1)).getString("datetime"));
		
		System.out.println("list(1).remark:"+JSONObject.fromObject(JSONArray.fromObject(JSONObject.fromObject(json.getString("result")).getString("list")).get(1)).getString("remark"));
		
		System.out.println("list(1).zone:"+JSONObject.fromObject(JSONArray.fromObject(JSONObject.fromObject(json.getString("result")).getString("list")).get(1)).getString("zone"));
		
		System.out.println("status:"+JSONObject.fromObject(json.getString("result")).getString("status"));
		
		System.out.println("reason:"+json.getString("error_code"));
	}
}
编译运行之后,将会得到以下结果:











### 如何从 `JSONArray` 中获取值 在 Java 中,`org.json.JSONArray` 提供了多种方法来访问 JSON 数组中的元素。通过这些方法可以轻松地提取数组中的单个值或子对象。 #### 使用索引来获取指定位置的值 可以通过调用 `get(int index)` 方法来获取特定索引处的值。如果该值是一个简单的数据类型(如字符串、整数等),可以直接转换;如果是嵌套的对象,则返回对应的 `JSONObject` 或其他类型的实例[^1]。 ```java import org.json.JSONArray; public class JsonArrayExample { public static void main(String[] args) { String jsonArrayString = "[\"apple\", \"banana\", \"cherry\"]"; JSONArray jsonArray = new JSONArray(jsonArrayString); // 获取第一个元素 (index 0) String firstElement = jsonArray.getString(0); System.out.println("First element: " + firstElement); // 输出 apple } } ``` #### 遍历整个 `JSONArray` 为了逐一遍历 `JSONArray` 并取出其内部的所有值,通常会结合 `for` 循环或者增强型 `for-each` 循环实现这一功能[^2]。 以下是基于传统 `for` 循环的方式: ```java import org.json.JSONArray; public class JsonArrayIterationExample { public static void main(String[] args) { String jsonArrayString = "[{\"name\":\"John\",\"age\":30},{\"name\":\"Anna\",\"age\":22}]"; JSONArray jsonArray = new JSONArray(jsonArrayString); int length = jsonArray.length(); for (int i = 0; i < length; i++) { // 假设每个项目都是 JSONObject 类型 Object obj = jsonArray.get(i); if (obj instanceof org.json.JSONObject) { org.json.JSONObject jsonObject = (org.json.JSONObject)obj; String name = jsonObject.optString("name", "Unknown"); int age = jsonObject.optInt("age", -1); System.out.println("Name: " + name + ", Age: " + age); } else { System.out.println("Unexpected type at index " + i); } } } } ``` 上述代码展示了如何解析包含多个 `JSONObject` 的复杂 `JSONArray`,并通过键名读取具体字段的内容[^2]。 --- #### 注意事项 当尝试从 `JSONArray` 取得某个值时需要注意可能发生的异常情况,比如越界错误 (`JSONException`) 和类型不匹配等问题。因此,在实际应用中建议加入适当的边界条件判断以及异常捕获机制以提高程序健壮性[^1]。 --- 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值