java 的 fastjson 库我们常用做 JSON 数据结构的工具库,其 API 中没有直接提供能判断当前 Json 字符串或 JSON 对象内部指定 key 是具体什么类型格式的方法(主要是区分 JSONObject 或 JSONArray 类型),需要开发者自行判断。
解决方法
在阐述解决方案之前,我们要明确的是,在 fastjson 中,JSON
是抽象类,JSONObject
和 JSONArray
都是其实现子类。
判断整个字符串的类型
判断整个字符串是 JSONObject 或 JSONArray 类型时,需要用 JSON 提供的 parse 方法,具体如下:
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
public class JSONDemo {
public static void main(String[] args) {
String text = "{\"knowledge\":\"dict\"}";
// String text = "[{\"knowledge\":\"dict\"},{\"knowledge\":\"qa\"}]";
Object object = JSON.parse(text);
if (object instanceof JSONObject) {
JSONObject jsonObject = (JSONObject) object;
System.out.println("JSONObject:" + jsonObject);
// do other things
} else if (object instanceof JSONArray) {
JSONArray jsonArray = (JSONArray) object;
System.out.println("JSONArray:" + jsonArray);
// do other things
} else {
System.out.println("either JSONObject or JSONArray, text:" + text);
// do other things
}
}
}
如上示例可以看出,如果不确定输入字符串 text 是什么格式的情况下,做如下操作:
- 用
JSON.parse
方法来解析内容; - 通过
instanceof
运算符判断返回的对象类型。
判断 JSON 内部元素的类型
JSON 对象的元素或 key 事先不知道具体什么类型,需要通过具体实例数据解析判断时,代码如下:
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
public class JSONDemo {
public static void main(String[] args) {
String text = "{\"knowledge\":{\"name\":\"dict\"}}";
// String text = "{\"knowledge\":[{\"name\":\"dict\"}]}";
JSONObject jsonObject = JSON.parseObject(text);
Object knowledgeObj = jsonObject.get("knowledge");
if (knowledgeObj instanceof JSONObject) {
JSONObject knowledgeJSONObj = (JSONObject) knowledgeObj;
System.out.println("JSONObject:" + knowledgeJSONObj);
// do other things
} else if (knowledgeObj instanceof JSONArray) {
JSONArray knowledgeJSONArr = (JSONArray) knowledgeObj;
System.out.println("JSONArray:" + knowledgeJSONArr);
// do other things
} else {
System.out.println("either JSONObject or JSONArray, knowledgeObj:" + knowledgeObj);
// do other things
}
}
}
根据上述代码可以看出,步骤如下:
- 利用
JSONObject.get
方法获取指定 key 的对象; - 通过
instanceof
运算符判断返回的对象类型。
如果是 JSONArray 的数据类型,第一步就改成 JSONArray.get
方法,参数由 key 变为数组的索引。