simple getjsonarray from create crear consumir android arrays json object

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?



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:

  1. 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 un JSONObject , si es un [ , está tratando con un JSONArray .
  2. Si está tratando con JSON (un Object ), entonces puede hacer una instanceof 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 ()