Transmisión de JSONObject a otra actividad

Estoy golpeando una API externa que está devolviendo datos JSON (nuevos títulos de dvd). Soy capaz de analizar el JSON y la lista de cada título de DVD y otra información de dvd en un ListView muy bien. También pude configurar un método onListItemClick muy bien para los datos primitivos (cadena de título). Terminé escribiendo algo así para el método onListItemClick:

Sólo para notar, el productArray es un var de clase que está siendo establecido por otro método que contiene una matriz de JSONObjects.

protected void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); Intent i = new Intent(DvdListingActivity.this, MovieProductActivity.class); try { JSONObject jsonObj = productArray.getJSONObject(position); i.putExtra("mTitle", jsonObj.getJSONObject("Title").opt("val").toString()); i.putExtra("mRelDate", jsonObj.getJSONObject("RelDate").opt("val").toString()); i.putExtra("mDesc", jsonObj.getJSONObject("Desc").opt("val").toString()); i.putExtra("mRating", jsonObj.getJSONObject("MPAA").getJSONObject("Rating").opt("val").toString()); i.putExtra("mActors", jsonObj.getJSONObject("Actors").opt("val").toString()); i.putExtra("mImage", jsonObj.getJSONObject("Image").opt("val").toString()); startActivity(i); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } } 

El código anterior funciona, pero estoy pensando que hay que ser una manera mejor para mí para pasar los datos a otra actividad. Pensaba que podría pasar un JSONObject que contiene todos los datos para una película del dvd en vez de fijar cada punto de datos individualmente.

He intentado durante una semana y media para averiguar cómo usar Parcelable. Intenté instanciar un JSONObject nuevo jsonObj que implementa Parcelable sin suerte. Seguí recibiendo un error en mi LogCat que decía que el objeto era un-parcelable.

He intentado leer el sitio de desarrolladores de Android y otros blogs, pero no pude aplicar sus ejemplos a lo que tenía que hacer.

Cualquier ayuda sería muy apreciada

Sólo puede encapsular toda la información sobre una película en un objeto Movie , que implementa Parcelable .

El código se verá similar al anterior, pero en lugar de pasar 6 extras diferentes, sólo puede pasar un extra que es la película.

 Movie movie = new Movie(); movie.setTitle(jsonObj.getJSONObject("Title").opt("val").toString()); movie.setRelDat(jsonObj.getJSONObject("RelDate").opt("val").toString()); . . . i.putExtra("movie", movie); 

Para obtener información sobre la implementación de un objeto Parcelable, consulte Documentos parcelables . Usted básicamente acaba de escribir cada cadena en 'writeToParcel', y leer en cada cadena de 'readFromParcel' en el orden correcto.

Simplemente puede poner un JSONObject entero como una cadena. Algo como esto:

i.putString("product", jsonObj.toString);

Y luego en el MovieProductActivity usted podría

JSONObject jsonObj = new JSONObject(getIntent().getStringExtra("product"));

La respuesta publicada aquí por Cheryl Simon es completamente correcta sin embargo esto no podría explicar demasiado claramente para alguien que es nuevo en Android o java. Por favor, déjame construir sobre su respuesta.

La mejor y más limpia forma de hacerlo es con la interfaz Parcelable.

Declare una clase como abajo que implementa Parcelable. Éste utiliza un accesor y mutador que no es realmente necesario.

 public class JSonArrayParser implements Parcelable { private JSONArray jsonArray; public JSonArrayParser() {} public JSonArrayParser(JSONArray jsonArray) { this.jsonArray = jsonArray; } public void setJsonArray(JSONArray jsonArray) { this.jsonArray = jsonArray; } public JSONArray getJsonArray() { return jsonArray; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { } } 

El siguiente paso sería crear una instancia de esa clase (en este caso JSonArrayParser) y pasarla a través del Bundle como en el ejemplo siguiente.

// Esto podría ser una Actividad, Fragmento, DialogFragment o cualquier clase que use el tipo de paquete como savedInstanceState.

 jobItemsPopUp = new JobItemsPopUp();//This example uses a DialogFragment. Bundle bundle = new Bundle(); JSonArrayParser jSonArrayParser = new JSonArrayParser(jsonArray); bundle.putParcelable("jsonArray", jSonArrayParser); jobItemsPopUp.setArguments(bundle); jobItemsPopUp.show(getActivity().getSupportFragmentManager(), "JobItemsPopUp"); 

La forma en que su recuperación del valor sería la siguiente (he utilizado el onCreate pero puede recuperar el valor en cualquier lugar):

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getArguments() != null) { this.jsonArray = ((JSonArrayParser) getArguments().getParcelable("jsonArray")).getJsonArray(); } } 

Sólo como una nota adicional: puede hacer esto con constructores personalizados, pero este método ha sido obsoleto por Google. El antiguo método obsoleto (asociado con la app app compat v4 NO RECOMENDADO ) sería:

 private Fragment MyFragment; MyFragment = new MyFragment(jsonArray) 

Espero que esta ayuda y aclara algunas cosas. La interfaz Parcelable se puede utilizar con cualquier clase de datos con o sin mutators y / o accessors.

De la actividad actual

 Intent mIntent = new Intent(CurrentActivity.this, TargetActivity.class); mIntent.putExtra("ITEM_EXTRA", json_object.toString()); startActivity(mIntent); 

De la actividad de la actividad objetivo

 try { json_object = new JSONObject(getIntent().getStringExtra("ITEM_EXTRA")); Log.e(TAG, "Example Item: " + json_object.getString("KEY")); } catch (JSONException e) { e.printStackTrace(); } 

¿Está almacenando la información en un DB? Si es así, simplemente puede pasar el ID del título deseado (a través de la intención).

Echa un vistazo a gson. Le permite sereialise y deserialise bloques JSON a instancias de clase enteras.

Simplemente crea un paquete como este:

 public class Parcel implements Serializable { private JSONObject obj; public Parcel(JSONObject obj) { this.obj = obj; } public JSONObject getObj() { return obj; }} 

Y poner en el paquete:

 Parcel p = new Parcel(data); Bundle args = new Bundle(); args.putSerializable("events", p); 

Finalmente, puede recuperar el JSONObject utilizando:

 JSONObject obj = ((Parcel) ((Bundle) getArguments()).getSerializable("events")).getObj(); 
  • ¿Cómo escribir Java.util.Map en el paquete de una manera inteligente?
  • Escribir una subclase de Parcelable a otra parcela
  • Android: ¿Cómo pasar el objeto Parcelable a la intención y el uso getParcelable método de paquete?
  • Android Parcelable Implementación con ArrayList <Object>
  • ¿Qué cargador de clases usar con Parcel.readHashMap?
  • Códigos de tipo de desbloqueo y valor de compensación y su significado?
  • Cómo guardar ArrayList personalizado en la rotación de la pantalla de Android?
  • Cómo escribir y leer org.joda.time.Date en la clase Parcelable
  • Pase Arraylist en Actividad a Fragmento
  • NullPointerException mientras se envía StringArray usando Parcelable
  • Uso de Parcelable con referencias circulares
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.