Проблема с парсингом Realm Android

Я пытаюсь проанализировать и вставить ответ JSON, используя базу данных Realm в Android. Ниже приведено исключение, с которым я столкнулся:

io.realm.exceptions.RealmException: Could not create JSON array from string
at io.realm.Realm.createOrUpdateAllFromJson(Realm.java:396)
at mobile.login.LoginFragment$1.onResponse(LoginFragment.java:218)
at okhttp3.RealCall$AsyncCall.execute(RealCall.java:133)
at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)                                                                                atjava.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)

JSON, который я пытаюсь разобрать:

{
  "count": 1,
  "statuses": [
    {
      "id": 0,
      "name": "Visible",
      "count": 0,
      "sort_order": 0
    },
    {
      "id": "1",
      "name": "Invisible",
      "count": 0,
      "sort_order": "1"
    }]
}

Count.java Pojo

public class Count extends RealmObject{

    @PrimaryKey
    private int count;

    private RealmList<Statuses> statuses;

    public int getCount() {
        return count;
    }
    public void setCount(int count) {
        this.count = count;
    }
    public RealmList<Statuses> getStatuses() {
        return statuses;
    }
    public void setStatuses(RealmList<Statuses> statuses) {
        this.statuses = statuses;
    }
}

Статусы.java Pojo

public class Statuses extends RealmObject{
    @PrimaryKey
    @SerializedName("id")
    @Expose
    private String id;
    @SerializedName("name")
    @Expose
    private String name;
    @SerializedName("count")
    @Expose
    private Integer count;
    @SerializedName("sort_order")
    @Expose
    private String sortOrder;

    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getCount() {
        return count;
    }
    public void setCount(Integer count) {
        this.count = count;
    }
    public String getSortOrder() {
        return sortOrder;
    }
    public void setSortOrder(String sortOrder) {
        this.sortOrder = sortOrder;
    }
}

Вот как я пытаюсь разобрать и сохранить JSON:

Realm realm = Realm.getInstance(getContext());
realm.beginTransaction();
realm.createOrUpdateAllFromJson(Order.class, **"JSON STRING HERE"**);
realm.commitTransaction();

Если кто-то может помочь мне решить эту проблему, то это действительно здорово. Заранее спасибо!


person Haresh Chaudhary    schedule 10.02.2016    source источник
comment
Я думаю, что с вашим json что-то не так. Посмотрите: stackoverflow.com/questions/29064868/ и: github.com/realm/realm-java/issues/968   -  person Opiatefuchs    schedule 10.02.2016


Ответы (1)


Метод createOrUpdateAllFromJson() предполагает, что ваш корневой объект в json — Array.

Ваш код работает правильно для этого json:

[{
  "count": 1,
  "statuses": [
    {
      "id": 0,
      "name": "Visible",
      "count": 0,
      "sort_order": 0
    },
    {
      "id": "1",
      "name": "Invisible",
      "count": 0,
      "sort_order": "1"
    }]
}]

Используйте createOrUpdateObjectFromJson() для добавления только одного объекта (спасибо @EpicPandaForce).


Вот исходный код метода createOrUpdateAllFromJson

/**
 * Tries to update a list of existing objects identified by their primary key with new JSON data. If an existing
 * object could not be found in the Realm, a new object will be created. This must happen within a transaction.
 *
 * @param clazz type of {@link io.realm.RealmObject} to create or update. It must have a primary key defined.
 * @param json string with an array of JSON objects.
 * @throws java.lang.IllegalArgumentException if trying to update a class without a
 * {@link io.realm.annotations.PrimaryKey}.
 * @throws RealmException if unable to create a JSON array from the json string.
 * @see #createAllFromJson(Class, String)
 */
public <E extends RealmObject> void createOrUpdateAllFromJson(Class<E> clazz, String json) {
    if (clazz == null || json == null || json.length() == 0) {
        return;
    }
    checkHasPrimaryKey(clazz);

    JSONArray arr;
    try {
        arr = new JSONArray(json);
    } catch (JSONException e) {
        throw new RealmException("Could not create JSON array from string", e);
    }

    createOrUpdateAllFromJson(clazz, arr);
}
person Ilya Tretyakov    schedule 10.02.2016
comment
Это также означает, что он должен попробовать createOrUpdateFromJson(), который ожидает не массив, а один объект. - person EpicPandaForce; 10.02.2016
comment
@llya Tretyakov: Что бы вы порекомендовали мне в качестве решения, поскольку ответ моего сервера - это то, что я не могу изменить. - person Haresh Chaudhary; 10.02.2016
comment
@HareshChaudhary посмотри на этот метод createOrUpdateObjectFromJson(). Его можно использовать для добавления одного объекта (не массива) - person Ilya Tretyakov; 10.02.2016
comment
@llya: Должен ли я преобразовать возвращенную строку с массивом JSON в объект JSON, а затем повторно преобразовать этот объект JSON в строку вручную, прежде чем передавать детали? - person Haresh Chaudhary; 10.02.2016
comment
Большое спасибо @IIya за идею, мне пришлось вручную добавить обе скобки, чтобы решить эту проблему, и да, вы были правы в своем ответе! - person Haresh Chaudhary; 11.02.2016
comment
@AndroidGeek, пожалуйста, помогите мне jhttp://jsoneditoronline.org/?id=cc5a403d1bbd933c250069a9221fcc02 - person Erum; 04.08.2017
comment
@IlyaTretyakov, пожалуйста, проверьте это jsoneditoronline.org/?id=cc5a403d1bbd933c250069a9221fcc02, как решить - person Erum; 04.08.2017