判断json是jsonobject还是jsonarray
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了判断json是jsonobject还是jsonarray相关的知识,希望对你有一定的参考价值。
参考技术A 区别在于JSONObject是一个包裹起来的一个对象(Object),而JSONArray则是[]包裹起来的一个数组(Array),说白点就是一个是数组一个是对象或字符串 参考技术B 使用 JSONTokener。 JSONTokener.nextValue()会给出一个对象,然后可以动态的转换为适当的类型。 Object json = new JSONTokener(jsonResponse).nextValue(); if(json instanceof JSONObject) JSONObject jsonObject = (JSONObject)json; //further actions on jsonObjects //... else if (json instanceof JSONArray) JSONArray jsonArray = (JSONArray)json; //further actions on jsonArray //... 参考技术C 这个不这样的确定JSON是JSONObject还是JSONArray
我将从服务器接收JSON对象或数组,但我不知道它将是什么。我需要使用JSON,但为了这样做,我需要知道它是Object还是Array。
我正在使用Android。
有没有人有这样做的好方法?
答案
我找到了更好的方法来确定:
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()
另一答案
有几种方法可以做到这一点:
- 您可以检查String的第一个位置处的字符(在删除空格之后,因为它在有效的JSON中是允许的)。如果它是
{
,你正在处理JSONObject
,如果它是[
,你正在处理JSONArray
。 - 如果您正在处理JSON(
Object
),那么您可以进行instanceof
检查。yourObject instanceof JSONObject
。如果yourObject是JSONObject,则返回true。这同样适用于JSONArray。
另一答案
这是我在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
}
另一答案
提出另一种方式:
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
是来自服务器的响应字符串
另一答案
我的方法将完全从中抽象出来。也许有人觉得这很有用......
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);
...
另一答案
这样做的一个更基本的方法如下。
JsonArray
天生就是List
JsonObject
天生就是Map
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);
...
...
}
另一答案
的instanceof
Object.getClass()的getName()
另一答案
对于那些在JavaScript中处理这个问题的人来说,以下是我的工作(不确定它的效率)。
if(object.length != undefined) {
console.log('Array found. Length is : ' + object.length);
} else {
console.log('Object found.');
}
以上是关于判断json是jsonobject还是jsonarray的主要内容,如果未能解决你的问题,请参考以下文章
Fastjson, Gson, org.json.JSON三者对于JSONObject及JSONArray的判断