Gson Как разобрать вложенные массивы - PullRequest
0 голосов
/ 22 мая 2018

Я получаю вложенный массив String JSON от API, который хочу создать объект ResultType и проанализировать его информацию.Однако я не уверен, как это сделать с помощью GSON.

Строка:

[
    [{
        "id": "1",
        "Type": "PERSON",
        "Text": "Bob",
        "phone": "123-456-7894",
        "email": "Bob@gmail.com",
        "company": "Bob's company"
    }],
    [{
        "id": "2",
        "Type": "PERSON",
        "Text": "Sam",
        "phone": "123-775-5597",
        "email": "Sam@gmail.com",
        "company": "Sam's company"
    }]
]

Я попытался создать класс, который содержит:

public class ResultType {
        private int id;
        private String Type;
        private String Text;
        private String phone;
        private String email;
        private String company;

        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

        public String getType() {
            return Type;
        }

        public void setType(String type) {
            Type = type;
        }

        public String getText() {
            return Text;
        }

        public void setText(String text) {
            Text = text;
        }

        public String getPhone() {
            return phone;
        }

        public void setPhone(String phone) {
            this.phone = phone;
        }

        public String getEmail() {
            return email;
        }

        public void setEmail(String email) {
            this.email = email;
        }

        public String getCompany() {
            return company;
        }

        public void setCompany(String company) {
            this.company = company;
        }


}

иЯ попытался сделать это в main:

    Type resultListType = new TypeToken<ArrayList<ResultType>>(){}.getType();
    List<ResultType> resultObj = new Gson().fromJson(result, resultListType);

или обработать его как массив в main:

ResultType resultObj[] = new Gson().fromJson(result, ResultType[].class);

Однако в обоих случаях я получаю сообщение об ошибке

Exception in thread "main" com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 3 path $[0]
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:226)
    at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:41)
    at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:82)
    at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:61)
    at com.google.gson.Gson.fromJson(Gson.java:922)
    at com.google.gson.Gson.fromJson(Gson.java:887)
    at com.google.gson.Gson.fromJson(Gson.java:836)
    at com.company.Main.main(Main.java:68)
Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 3 path $[0]
    at com.google.gson.stream.JsonReader.beginObject(JsonReader.java:385)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:215)
    ... 7 more

1 Ответ

0 голосов
/ 23 мая 2018

Класс, который вы сделали, правильный.Вам также необходимо создать ArrayList для всех объектов, которые у вас есть в этом массиве JSON,

ArrayList<ResultType> all = new ArrayList<ResultType>;

Для анализа этого результата JSON вы можете использовать JSONArray и JSONObject объектов.Поскольку у вас есть массив массивов (даже если у каждого внутреннего массива есть один объект), вы можете сделать что-то вроде этого

JSONArray result_array= new JSONArray(string_result);
JSONArray internal_array;
JSONObject object;
ResultType temp;

for(int i=0;i<result_array.size();i++){//scan the main array
    internal_array  new JSONArray(result_array.get(i)); //get the i array

    for(int k=0;k<internal_array.size();k++){ //scan the i intern array(with always one element)
          object = new JSONObject(internal_array.get(k));
          temp = new ResultType();
          temp.setId(object.getString("id"));
          temp.setId(object.getString("phone"));
          .
          .
          all.add(temp);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...