1. 需求
最近有个需求: 要接收某个接口的 JSON 数据,而这个JSON数据有可能是一个 JSON 对象,也有可能是一个 JSON数组。
"{'name','王五','age':10}"
"[{'name':'张三','age':12},{'name':'李四','age':11}]"
现在呢,我需要根据传递过来的 JSON 数据进行判断,如果是对象就调用 resolve1(),如果是数组就调用 resolve2()。
依赖:
-
本文采用 fastjson 来处理 JSON 数据
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.83</version> </dependency>
-
因为要处理 JSON 数组,所以要使用 JSONArray.parseArray
2. 测试
首先呢,要判断 JSON 数据是否是一个数组,那么我首先想到的是,我用 JSONArray.parseArray 会不会出现异常,如果出现了异常,那我 try-catch 一下,再定义一个标志位,不是很简单就能实现了吗。
测试代码:
/**
* @author chenjy
* @description:
* @date 2023/1/11
*/
public class JSONTest {
public static void main(String[] args) {
String jsonArr = "[{'name':'张三','age':12},{'name':'李四','age':11}]";
String jsonObj = "{'name':'王五','age':10}";
JSONArray jsonArray = JSONArray.parseArray(jsonArr);
System.out.println(jsonArray);
JSONArray jsonObject = JSONArray.parseArray(jsonObj);
System.out.println(jsonObject);
}
}
控制台输出:
很显然,JSONArray.parseArray 转换 JSON 对象 的时候会抛出异常 com.alibaba.fastjson.JSONException,那么我们实现需求的思路就变得简单起来了。
兴趣使然,我再来看一下 JSONObject.parseObject 能不能转换 JSON 数组。
测试代码:
/**
* @author chenjy
* @description:
* @date 2023/1/11
*/
public class JSONTest {
public static void main(String[] args) {
String jsonArr = "[{'name':'张三','age':12},{'name':'李四','age':11}]";
String jsonObj = "{'name':'王五','age':10}";
JSONObject jsonObject = JSONObject.parseObject(jsonObj);
System.out.println(jsonObject);
JSONObject jsonArray = JSONObject.parseObject(jsonArr);
System.out.println(jsonArray);
}
}
控制台输出:
果然,也会抛出异常 com.alibaba.fastjson.JSONException。
3. 实现需求
好的,经过上面的测试,我们的需求实现思路:新增一个标志位 flag = true,在 catch 中将 flag 置为 false。然后根据标志位去调用方法。
/**
* @author chenjy
* @description:
* @date 2023/1/11
*/
public class JSONTest {
public static void main(String[] args) {
String jsonArr = "[{'name':'张三','age':12},{'name':'李四','age':11}]";
String jsonObj = "{'name':'王五','age':10}";
System.out.println("======测试 JSON 数组======");
getParam(jsonArr);
System.out.println("======测试 JSON 对象======");
getParam(jsonObj);
}
public static void getParam(String str) {
try {
JSONArray jsonArray = JSONArray.parseArray(str);
resolve2(jsonArray);
} catch (JSONException e) {
JSONObject jsonObject = JSONObject.parseObject(str);
resolve1(jsonObject);
}
}
/*
处理对象
*/
public static void resolve1(JSONObject obj) {
System.out.println("姓名:" + obj.getString("name") + "年龄:" + obj.get("age"));
}
/*
处理数组
*/
public static void resolve2(JSONArray array) {
for (Object obj : array) {
JSONObject jObj = (JSONObject) JSON.toJSON(obj);
System.out.println("姓名:" + jObj.getString("name") + "年龄:" + jObj.get("age"));
}
}
}