Передача JSONObject в другое действие - PullRequest
37 голосов
/ 22 февраля 2011

Я использую внешний API, который возвращает данные JSON (новые заголовки DVD). Я могу разобрать JSON и перечислить каждый заголовок DVD и другую информацию DVD в ListView просто отлично. Я также был в состоянии настроить метод onListItemClick просто отлично для примитивных данных (строка заголовка). В итоге я написал что-то вроде этого для метода onListItemClick:

Просто отметим, что productArray - это класс var, который устанавливается другим методом, который содержит массив 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();
    }       

}

Вышеприведенный код работает, но я думаю, что ДОЛЖЕН быть лучший способ передать данные в другое действие. Я думал, что смогу передать JSONObject, который содержит все данные для фильма DVD, вместо того, чтобы устанавливать каждую точку данных по отдельности.

Я пытался в течение полутора недель понять, как использовать Parcelable. Я попытался создать новый JSONObject jsonObj, который реализует Parcelable, но безуспешно. Я продолжал получать сообщение об ошибке в моем LogCat, в котором говорилось, что объект неразборчив.

Я пытался читать сайт разработчиков Android и другие блоги, но я не мог применить их примеры к тому, что мне нужно было сделать.

Любая помощь будет высоко ценится

Ответы [ 7 ]

191 голосов
/ 14 марта 2011

Вы можете просто поместить весь JSONObject в виде строки. Примерно так:

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

И тогда в MovieProductActivity вы могли бы

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

15 голосов
/ 17 января 2016

из текущей активности

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

Из созданной целевой операции

try {
   json_object = new JSONObject(getIntent().getStringExtra("ITEM_EXTRA"));

   Log.e(TAG, "Example Item: " + json_object.getString("KEY"));

} catch (JSONException e) {
   e.printStackTrace();
}
13 голосов
/ 22 февраля 2011

Вы можете просто инкапсулировать всю информацию о фильме в объект Movie, который реализует Parcelable.

Код будет выглядеть примерно так, как указано выше, но вместо того, чтобы пропустить 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 docs . Вы просто записываете каждую строку в «writeToParcel» и читаете каждую строку в «readFromParcel» в правильном порядке.

7 голосов
/ 17 сентября 2014

Ответ, опубликованный здесь Шерил Саймон, является полностью правильным, однако это не может объяснить это слишком ясно для новичка в Android или Java. Пожалуйста, позвольте мне развить ее ответ.

Лучший и самый чистый способ сделать это с помощью интерфейса 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) {

    }
}

Следующим шагом будет создание экземпляра этого класса (в данном случае JSonArrayParser) и его передача через Bundle, как в примере ниже.

// Это может быть Activity, Fragment, DialogFragment или любой класс, использующий тип пакета, такой как saveInstanceState.

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. Старый устаревший метод (связанный с приложением compat v4 НЕ РЕКОМЕНДУЕТСЯ ) будет выглядеть следующим образом:

private Fragment MyFragment;
MyFragment = new MyFragment(jsonArray)

Надеюсь, что это поможет и прояснит некоторые вещи. Интерфейс Parcelable может использоваться с любым классом данных с мутаторами и / или аксессорами или без них.

1 голос
/ 31 декабря 2016

Просто создайте Посылку следующим образом:

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();
1 голос
/ 22 февраля 2011

Посмотрите на GSON. Это позволяет сортировать и десериализовать BLOB-объекты JSON для всех экземпляров класса.

1 голос
/ 22 февраля 2011

Вы храните информацию в БД?Если да, вы можете просто передать идентификатор нужного заголовка (через намерение).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...