Модернизации предполагается начать возражать, но был начаться массива



Я довольно новичок в разборе JSON, я использую модифицированную библиотеку Square и столкнулся с этой проблемой.



Я пытаюсь разобрать этот ответ JSON:



[
{
"id": 3,
"username": "jezer",
"regid": "oiqwueoiwqueoiwqueoiwq",
"url": "http://192.168.63.175:3000/users/3.json"
},
{
"id": 4,
"username": "emulator",
"regid": "qwoiuewqoiueoiwqueoq",
"url": "http://192.168.63.175:3000/users/4.json"
},
{
"id": 7,
"username": "test",
"regid": "ksadqowueqiaksj",
"url": "http://192.168.63.175:3000/users/7.json"
}
]


вот мои модели:



public class Contacts {

public List<User> contacts;

}


...



public class User {

String username;
String regid;

@Override
public String toString(){
return(username);
}

}


интерфейс:



public interface ContactsInterface {

@GET("/users.json")
void contacts(Callback<Contacts> cb);

}


мой путь к успеху:



@Override
public void success(Contacts c, Response r) {
List<String> names = new ArrayList<String>();
for (int i = 0; i < c.contacts.size(); i++) {
String name = c.contacts.get(i).toString();
Log.d("Names", "" + name);
names.add(name);
}
ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item, names);
mSentTo.setAdapter(spinnerAdapter);
}


когда я использую его на моем методе успеха он выдает ошибку




ожидаемый BEGIN_OBJECT но был BEGIN_ARRAY в строке 1 column2




что здесь не так?

611   6  

6 ответов:

прямо сейчас вы анализируете ответ, как если бы он был отформатирован следующим образом:

{
  "contacts": [
    { .. }
  ]
}

исключение говорит вам об этом в том, что вы ожидаете объект в корне, но реальные данные на самом деле массив. Это означает, что вы должны изменить тип массива.

самый простой способ-просто использовать список в качестве прямого типа в обратном вызове:

@GET("/users.json")
void contacts(Callback<List<User>> cb);

в свой интерфейс заменить

@GET("/users.json")
void contacts(Callback<Contacts> cb);

этот код

@GET("/users.json")
void contacts(Callback<List<Contacts>> cb);

преобразовать его в список.

Ниже приведен пример:

BenchmarksListModel_v1[] benchmarksListModel = res.getBody().as(BenchmarksListModel_v1[].class);

Исходный Код Работающего

https://drive.google.com/open?id=0BzBKpZ4nzNzUVFRnVVkzc0JabUU

public interface ApiInterface {
    @GET("inbox.json")
    Call<List<Message>> getInbox();
}

 call.enqueue(new Callback<List<Message>>() {
            @Override
            public void onResponse(Call<List<Message>> call, Response<List<Message>> response) {

        YourpojoClass.addAll(response.body());

                mAdapter.notifyDataSetChanged();
            }

            @Override
            public void onFailure(Call<List<Message>> call, Throwable t) {
                Toast.makeText(getApplicationContext(), "Unable to fetch json: " + t.getMessage(), Toast.LENGTH_LONG).show();
            }
        });

dependencies used :

compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:converter-gson:2.3.0'

ответы json могут быть array response или object response или даже сочетание того и другого. См. следующие три случая

Case 1 : Parsing a json array response (дело ОП)

этот случай относится к тем json responses по форме [{...} ,{...}]

например.

[
  {
    "id": 3,
    "username": "jezer",
    "regid": "oiqwueoiwqueoiwqueoiwq",
    "url": "http:\/\/192.168.63.175:3000\/users\/3.json"
  },
  .
  .
]

сначала создайте класс модели для этого массива или просто goto jsonschema2pojo и авто создать один, как показано ниже

Contacts.java

public class Contacts {

@SerializedName("id")
@Expose
private Integer id;
@SerializedName("username")
@Expose
private String username;
@SerializedName("regid")
@Expose
private String regid;
@SerializedName("url")
@Expose
private String url;

public Integer getId() {
return id;
}

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

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public String getRegid() {
return regid;
}

public void setRegid(String regid) {
this.regid = regid;
}

public String getUrl() {
return url;
}

public void setUrl(String url) {
this.url = url;
}

}

ContactsInterface

в этом случае вы должны вернуть список объектов, как показано ниже

public interface ContactsInterface {
@GET("/users.json")
Call<List<Contacts>> getContacts();
}

затем сделать retrofit2 вызовите как следующее

Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("baseurl_here")
            .addConverterFactory(GsonConverterFactory.create())
            .build();
    SampleInterface request = retrofit.create(ContactsInterface.class);
    Call<List<Contacts>> call = request.getAll();
    call.enqueue(new Callback<List<Contacts>>() {
        @Override
        public void onResponse(Call<List<Contacts>> call, Response<List<Contacts>> response) {
            Toast.makeText(MainActivity.this,response.body().toString(),Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onFailure(Call<List<Contacts>> call, Throwable t) {
            Log.e("Error",t.getMessage());
        }
    });

response.body() даст вам список объектов

ВЫ ТАКЖЕ МОЖЕТЕ ПРОВЕРИТЬ СЛЕДУЮЩИЕ ДВА СЛУЧАЯ Ссылка

Case 2 : Parsing a json object response

этот случай относится к тем ответам json, которые имеют форму {..}

например.

{
"id": 3,
"username": "jezer",
"regid": "oiqwueoiwqueoiwqueoiwq",
"url": "http:\/\/192.168.63.175:3000\/users\/3.json"
}

вот, у нас то же самое object в примере выше. Таким образом, класс модели будет таким же, но, как и в приведенном выше примере, у нас нет массива этих объектов - только один объект, и поэтому нам не нужно анализировать его как список.

поэтому внесите следующие изменения object response

public interface ContactsInterface {
    @GET("/users.json")
    Call<Contacts> getContacts();
    }

затем сделать retrofit2 вызовите как следующее

Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("baseurl_here")
            .addConverterFactory(GsonConverterFactory.create())
            .build();
    SampleInterface request = retrofit.create(ContactsInterface.class);
    Call<Contacts> call = request.getAll();
    call.enqueue(new Callback<Contacts>() {
        @Override
        public void onResponse(Call<Contacts> call, Response<Contacts> response) {
            Toast.makeText(MainActivity.this,response.body().toString(),Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onFailure(Call<Contacts> call, Throwable t) {
            Log.e("Error",t.getMessage());
        }
    });

response.body() даст вам объект

Case 3 : Parsing a json array inside json object

этот случай относится к тем json responses по форме {"array_name":[{...} ,{...}]}

например.

    {
    "contacts": 
         [
            {
             "id": 3,
             "username": "jezer",
             "regid": "oiqwueoiwqueoiwqueoiwq",
             "url": "http:\/\/192.168.63.175:3000\/users\/3.json"
            }
         ]
    }

здесь вам понадобятся два класса моделей, так как у нас есть два объекта(один снаружи и один внутри массива).Генерировать его, как ниже

ContactWrapper

public class ContactWrapper {

@SerializedName("contacts")
@Expose
private List<Contacts> contacts = null;

public List<Contacts> getContacts() {
return contacts;
}

public void setContacts(List<Contacts> contacts) {
this.contacts = contacts;
}

}

можно использовать Contacts.java генерируется выше для объектов списка (генерируется для случая 1)

поэтому внесите следующие изменения для object response

public interface ContactsInterface {
    @GET("/users.json")
    Call<ContactWrapper> getContacts();
    }

затем сделать retrofit2 вызовите как следующее

Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("baseurl_here")
            .addConverterFactory(GsonConverterFactory.create())
            .build();
    SampleInterface request = retrofit.create(ContactsInterface.class);
    Call<ContactWrapper> call = request.getAll();
    call.enqueue(new Callback<ContactWrapper>() {
        @Override
        public void onResponse(Call<ContactWrapper> call, Response<ContactWrapper> response) {
            Toast.makeText(MainActivity.this,response.body().getContacts().toString(),Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onFailure(Call<ContactWrapper> call, Throwable t) {
            Log.e("Error",t.getMessage());
        }
    });

здесь отличие от случая 1 заключается в том, что мы должны использовать response.body().getContacts() вместо response.body() чтобы получить список объектов

С помощью MPV, в вашем Десериализаторе, положите это

JsonObject obj = new JsonObject();
obj.add("data", json);

JsonArray data  = obj.getAsJsonObject().getAsJsonArray("data");

Comments

    Ничего не найдено.