将JSONObject传递给另一个活动

我打了一个外部的API返回JSON数据(新的DVD标题)。 我能parsing出JSON,并列出每个DVD标题和其他DVD信息到一个ListView就好了。 我也能够为原始数据(标题string)设置一个onListItemClick方法。 我最终为onListItemClick方法写了类似的东西:

需要注意的是,productArray是一个由另一个包含JSONObjects数组的方法设置的类var。

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(); } } 

上面的代码都可以工作,但是我认为GOTTA是一个更好的方式来将数据传递给另一个Activity。 我在想,我将能够传递一个包含DVD电影的所有数据的JSONObject,而不是单独设置每个数据点。

我试了一个半星期才弄清楚如何使用Parcelable。 我试图实例化一个新的JSONObject jsonObj实现Parcelable没有运气。 我一直在我的LogCat中发现一个错误,说对象是不可分的。

我试过阅读Android开发者网站和其他博客,但是我不能将他们的例子应用到我需要做的事情上。

任何帮助将非常感激

您可以将有关电影的所有信息封装到实现了ParcelableMovie对象中。

代码看起来和上面类似,但不是传递6个不同的额外内容,而是传递一个额外的就是电影。

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

有关实现Parcelable对象的信息,请参阅Parcelable文档 。 您基本上只是写出'writeToParcel'中的每个string,并按照正确的顺序读取'readFromParcel'中的每个string。

你可以简单地把整个JSONObject作为一个string。 像这样的东西:

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

然后在MovieProductActivity你可以

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

谢丽尔·西蒙在这里发布的答案是完全正确的,但是对于刚刚接触android或java的人来说,这可能无法解释得太清楚。 请让我build立她的答案。

最好和最干净的方法是使用Parcelable接口。

声明一个类如下实现Parcelable。 这一个使用一个实际上不必要的访问器和增变器。

 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) { } } 

下一步是创build该类的实例(在本例中为JSonArrayParser),并通过Bundle传递它,如下例所示。

//这可以是一个Activity,Fragment,DialogFragment或任何使用Bundle Type的类,比如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"); 

您将检索值的方式如下(我已经使用onCreate,但您可以检索任何地方的价值):

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

正如一个额外的注意事项:你可以用自定义的构造函数来做到这一点,但是这个方法已经被Google弃用了。 旧的弃用方法(与app compat v4 NOT RECOMMENDED关联)将是:

 private Fragment MyFragment; MyFragment = new MyFragment(jsonArray) 

希望这个帮助,并清除了一些东西了。 Parcelable接口可以与任何带有或不带mutators和/或accessor的数据类一起使用。

从当前活动

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

从目标活动的onCreate

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

你将信息存储在数据库中吗? 如果你是,你可以简单地传递所需标题的ID(通过意图)。

看看gson。 它允许您对整个类实例进行sereialise和反序列化JSON blob。

只要像这样创build一个包裹:

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

并放入包中:

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

最后,您可以使用以下方法获取JSONObject:

 JSONObject obj = ((Parcel) ((Bundle) getArguments()).getSerializable("events")).getObj();