确定 JSON 是 JSONObject 还是 JSONArray

我将从服务器接收 JSON 对象或 Array,但我不知道它是哪个。我需要使用 JSON,但是为了这样做,我需要知道它是一个对象还是一个数组。

我在和安卓合作。

有人有什么好办法吗?

98307 次浏览

Instanceof

GetClass () . getName ()

有几种方法可以做到这一点:

  1. 您可以在 String 的第一个位置检查字符(在删除空格之后,因为它在有效的 JSON 中是允许的)。如果它是一个 {,你正在处理一个 JSONObject,如果它是一个 [,你正在处理一个 JSONArray
  2. 如果处理的是 JSON (Object) ,那么可以进行 instanceof检查。yourObject instanceof JSONObject.如果 yourObject 是 JSONObject,则返回 true。这同样适用于 JSONArray。

我找到了更好的方法来确定:

String data = "{ ... }";
Object json = new JSONTokener(data).nextValue();
if (json instanceof JSONObject)
//you have an object
else if (json instanceof JSONArray)
//you have an array

Tokenizer 能够返回更多的类型: http://developer.android.com/reference/org/json/JSONTokener.html#nextValue()

我的方法完全是抽象的,也许有人觉得这很有用..。

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Map;


import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;


public class SimpleJSONObject extends JSONObject {




private static final String FIELDNAME_NAME_VALUE_PAIRS = "nameValuePairs";




public SimpleJSONObject(String string) throws JSONException {
super(string);
}




public SimpleJSONObject(JSONObject jsonObject) throws JSONException {
super(jsonObject.toString());
}




@Override
public JSONObject getJSONObject(String name) throws JSONException {


final JSONObject jsonObject = super.getJSONObject(name);


return new SimpleJSONObject(jsonObject.toString());
}




@Override
public JSONArray getJSONArray(String name) throws JSONException {


JSONArray jsonArray = null;


try {


final Map<String, Object> map = this.getKeyValueMap();


final Object value = map.get(name);


jsonArray = this.evaluateJSONArray(name, value);


} catch (Exception e) {


throw new RuntimeException(e);


}


return jsonArray;
}




private JSONArray evaluateJSONArray(String name, final Object value) throws JSONException {


JSONArray jsonArray = null;


if (value instanceof JSONArray) {


jsonArray = this.castToJSONArray(value);


} else if (value instanceof JSONObject) {


jsonArray = this.createCollectionWithOneElement(value);


} else {


jsonArray = super.getJSONArray(name);


}
return jsonArray;
}




private JSONArray createCollectionWithOneElement(final Object value) {


final Collection<Object> collection = new ArrayList<Object>();
collection.add(value);


return (JSONArray) new JSONArray(collection);
}




private JSONArray castToJSONArray(final Object value) {
return (JSONArray) value;
}




private Map<String, Object> getKeyValueMap() throws NoSuchFieldException, IllegalAccessException {


final Field declaredField = JSONObject.class.getDeclaredField(FIELDNAME_NAME_VALUE_PAIRS);
declaredField.setAccessible(true);


@SuppressWarnings("unchecked")
final Map<String, Object> map = (Map<String, Object>) declaredField.get(this);


return map;
}




}

现在永远摆脱这种行为。

...
JSONObject simpleJSONObject = new SimpleJSONObject(jsonObject);
...

这是我在 Android 上使用的简单解决方案:

JSONObject json = new JSONObject(jsonString);


if (json.has("data")) {


JSONObject dataObject = json.optJSONObject("data");


if (dataObject != null) {


//Do things with object.


} else {


JSONArray array = json.optJSONArray("data");


//Do things with array
}
} else {
// Do nothing or throw exception if "data" is a mandatory field
}

对于那些用 JavaScript 处理这个问题的人来说,以下代码为我完成了工作(不确定它的效率如何)。

if(object.length != undefined) {
console.log('Array found. Length is : ' + object.length);
} else {
console.log('Object found.');
}

一个更基本的方法是这样做。

JsonArray本质上是 名单

JsonObject本质上是 地图

if (object instanceof Map){
JSONObject jsonObject = new JSONObject();
jsonObject.putAll((Map)object);
...
...
}
else if (object instanceof List){
JSONArray jsonArray = new JSONArray();
jsonArray.addAll((List)object);
...
...
}

呈现另一种方式:

if(server_response.trim().charAt(0) == '[') {
Log.e("Response is : " , "JSONArray");
} else if(server_response.trim().charAt(0) == '{') {
Log.e("Response is : " , "JSONObject");
}

这里的 server_response是来自服务器的响应 String

JsonNode jsonNode=mapper.readTree(patchBody);

JsonNode 有两种方法:
IsObject () ;
IsArray () ;