Определите, является ли JSON JSONObject или JSONArray
Я собираюсь получить объект или массив JSON с сервера, но я понятия не имею, что это будет. Мне нужно работать с JSON, но для этого мне нужно знать, является ли это объектом или массивом.
Я работаю с Android.
Есть ли у кого-нибудь хороший способ сделать это?
Ответы
Ответ 1
Я нашел лучший способ определить:
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()
Ответ 2
Есть несколько способов сделать это:
- Вы можете проверить символ в первой позиции строки (после обрезания пробела, как это разрешено в действительном JSON). Если это
{
, вы имеете дело с JSONObject
, если это [
, вы имеете дело с JSONArray
.
- Если вы имеете дело с JSON (a
Object
), вы можете сделать проверку instanceof
. yourObject instanceof JSONObject
. Это вернет true, если ваш объект является JSONObject. То же самое относится к JSONArray.
Ответ 3
Это простое решение, которое я использую на 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
}
}
Ответ 4
Представляя другой способ:
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
- строка ответа, исходящая от сервера
Ответ 5
Мой подход будет полной абстракцией от этого. Может быть, кто-то найдет это полезным...
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);
...
Ответ 6
Более фундаментальный способ сделать это следующий.
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);
...
...
}
Ответ 7
InstanceOf
object.getClass(). GetName()
Ответ 8
Для тех, кто решает эту проблему в JavaScript, следующее выполнило эту работу для меня (не уверен, насколько она эффективна).
if(object.length != undefined) {
console.log('Array found. Length is : ' + object.length);
} else {
console.log('Object found.');
}