RetroFit:java.lang.IllegalStateException:期望BEGIN_OBJECT,但是BEGIN_ARRAY在第1行第2列路径$
问题描述:
我目前使用的是RetroFit,并且是新的工具。当我运行我的应用程序时,我遇到了标题中所述的问题。它不会崩溃,但它不会返回我需要的信息。我附上我的代码。非常感谢您的帮助。
public class MainActivity extends AppCompatActivity {
@Bind(R.id.textView_userid) TextView textView_userid;
@Bind(R.id.textView_email) TextView textView_email;
@Bind(R.id.textView_password) TextView textView_password;
@Bind(R.id.textView_firstName) TextView textView_firstname;
@Bind(R.id.textView_lastname) TextView textView_lastname;
@Bind(R.id.refresh_button) Button refresh_button;
@Override
protected void onCreate(Bundle savedInstanceState) {
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().permitAll().build());
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
}
@OnClick(R.id.refresh_button)
public void onClick_Refresh(){
UserApi.Factory.getInstance().getUsers().enqueue(new Callback<User>() {
@Override
public void onResponse(Response<User> response, Retrofit retrofit) {
textView_userid.setText(response.body().getUserId());
textView_email.setText(response.body().getEmail());
textView_firstname.setText(response.body().getFirstName());
textView_lastname.setText(response.body().getLastName());
Log.e("Info", response.body().toString());
Log.v("Get", response.body().toString());
}
@Override
public void onFailure(Throwable t) {
Log.e("failed", t.getMessage());
}
});
}
@Override
protected void onResume(){
super.onResume();
onClick_Refresh();
}
}
public interface UserApi {
String baseUrl = "http://someUrl/";
@GET("users")
Call<User> getUsers();
class Factory{
private static UserApi service;
public static UserApi getInstance(){
if(service == null){
Retrofit retrofit = new Retrofit.Builder().addConverterFactory(GsonConverterFactory.create()).baseUrl(baseUrl).build();
service = retrofit.create(UserApi.class);
return service;
}else{
return service;
}
}
}
}
@Generated( “org.jsonschema2pojo”) 公共类用户{
@SerializedName("userId")
@Expose
private int userId;
@SerializedName("email")
@Expose
private String email;
@SerializedName("firstName")
@Expose
private String firstName;
@SerializedName("lastName")
@Expose
private String lastName;
/**
*
* @return
* The userId
*/
public int getUserId() {
return userId;
}
/**
*
* @param userId
* The userId
*/
public void setUserId(int userId) {
this.userId = userId;
}
/**
*
* @return
* The email
*/
public String getEmail() {
return email;
}
/**
*
* @param email
* The email
*/
public void setEmail(String email) {
this.email = email;
}
/**
*
* @return
* The firstName
*/
public String getFirstName() {
return firstName;
}
/**
*
* @param firstName
* The firstName
*/
public void setFirstName(String firstName) {
this.firstName = firstName;
}
/**
*
* @return
* The lastName
*/
public String getLastName() {
return lastName;
}
/**
*
* @param lastName
* The lastName
*/
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
[{"userId":1,"email":"[email protected]","password":"abc123","firstName":"bob","lastName":"joe"}]
答
的JSON剪断您提供节目您收到的阵列,而不是的对象请尝试更改以下代码:
UserApi.Factory.getInstance().getUsers().enqueue(new Callback<User>() {
@Override
public void onResponse(Response<User> response, Retrofit retrofit) {
}
@Override
public void onFailure(Throwable t) {
Log.e("failed", t.getMessage());
}
});
为了这样的事情:
UserApi.Factory.getInstance().getUsers().enqueue(new Callback<List<User>>() {
@Override
public void onResponse(Response<List<User>> response, Retrofit retrofit) {
List<User> users = response.body;
// Do something with the rest
}
@Override
public void onFailure(Throwable t) {
Log.e("failed", t.getMessage());
}
});
答
首先,改变身体的onResponse到
@Override
public void onResponse(Response<List<User>> response, Retrofit retrofit) {
List<User> users = response.body;
}
其次,对于同时测定哪里想到的JSONObject或jsonArray,你可以使用这个网站,you can get equivalent POJO for any Json response.
答
谢谢你们的帮助。我对界面和主要活动进行了一些更改。下面的结果工作。
UserApi.Factory.getInstance().getUsers().enqueue(new Callback<List<User>>() {
@Override
public void onResponse(Response<List<User>> response, Retrofit retrofit) {
for(User user: response.body()){
Log.v("Endpoint Response: ", user.toString());
textView_userid.setText(String.valueOf(user.getUserId()));
textView_email.setText(user.getEmail());
textView_firstname.setText(user.getFirstName());
textView_lastname.setText(user.getLastName());
}
}
@Override
public void onFailure(Throwable t) {
Log.e("failed", t.getMessage());
}
});
@GET("users")
Call<List<User>> getUsers();
class Factory{
private static UserApi service;
public static UserApi getInstance(){
if(service == null){
Retrofit retrofit = new Retrofit.Builder().addConverterFactory(GsonConverterFactory.create()).baseUrl(baseUrl).build();
service = retrofit.create(UserApi.class);
return service;
}else{
return service;
}
}
}
你的问题还不够清楚,你能告诉我们什么方法正好引发异常。无论如何,从标题中的错误文本我得出结论,该方法是期待JSON对象,而不是JSON数组。 – stjepano
另外,您可以查看http://stackoverflow.com/a/23670188/2450855 –