getjsonarray - jsonobject android class
Determine si JSON es un JSONObject o JSONArray (8)
Voy a recibir un objeto JSON o una matriz del servidor, pero no tengo idea de cuál será. Necesito trabajar con JSON, pero para hacerlo, necesito saber si es un Object o un Array.
Estoy trabajando con Android.
¿Alguien tiene una buena manera de hacer esto?
Encontré una mejor manera de determinar:
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 puede devolver más tipos: http://developer.android.com/reference/org/json/JSONTokener.html#nextValue ()
Esta es la solución simple que estoy usando en 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
}
Hay un par de formas en que puede hacer esto:
- Puede verificar el carácter en la primera posición de la Cadena (después de recortar el espacio en blanco, ya que está permitido en JSON válido). Si es un
{
, está tratando con unJSONObject
, si es un[
, está tratando con unJSONArray
. - Si está tratando con JSON (un
Object
), entonces puede hacer unainstanceof
verificación.yourObject instanceof JSONObject
. Esto devolverá verdadero si yourObject es un JSONObject. Lo mismo se aplica a JSONArray.
Mi enfoque sería una abstracción total de esto. Tal vez alguien encuentre esto útil ...
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;
}
}
Y ahora deshazte de este comportamiento para siempre ...
...
JSONObject simpleJSONObject = new SimpleJSONObject(jsonObject);
...
Para aquellos que abordan este problema en JavaScript, el siguiente me hizo el trabajo (no estoy seguro de cuán eficiente es).
if(object.length != undefined) {
console.log(''Array found. Length is : '' + object.length);
} else {
console.log(''Object found.'');
}
Presentando de otra manera:
if(server_response.trim().charAt(0) == ''['') {
Log.e("Response is : " , "JSONArray");
} else if(server_response.trim().charAt(0) == ''{'') {
Log.e("Response is : " , "JSONObject");
}
Aquí server_response
es una respuesta Cadena proveniente del servidor
Una forma más fundamental de hacer esto es lo siguiente.
JsonArray
es intrínsecamente una List
JsonObject
es intrínsecamente un 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);
...
...
}
en vez de
Object.getClass (). GetName ()