JSON 未使用 Retrofit 获取数据

JSON data is not fetching using Retrofit

我正在使用改装网络库从 server.I 中获取数据,我正在使用 MVVM 架构模型创建一个 app.When 应用程序启动时显示一些异常并且未获取数据。

java.lang.IllegalStateException:Expected BEGIN_OBJECT but was BEGIN_ARRAY at Line 1 Column 2 path $.

我不明白它在做什么say.Below是我的代码。

RetrofitClient.java

public class RetrofitClient {

private static Retrofit retrofit = null;
private static final String URL = "https://example.com/";

public static Retrofit getInstance(){

    OkHttpClient okHttpClient = new OkHttpClient.Builder()
                              .connectTimeout(20, TimeUnit.SECONDS)
                              .readTimeout(20,TimeUnit.SECONDS)
                              .writeTimeout(20,TimeUnit.SECONDS)
                              .build();

    if(retrofit == null){

        retrofit = new Retrofit.Builder()
                   .baseUrl(URL)
                   .addConverterFactory(GsonConverterFactory.create(new GsonBuilder().setLenient().create()))
                   .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                   .client(okHttpClient)
                   .build();
    }

    return retrofit;
  }

private RetrofitClient(){

  }
}

ApiService.class

public interface ApiService {

    @GET("getUsers")
    Call<User> getUser();
}

User.java

public class User {

@SerializedName("name")
@Expose
private String name;

@SerializedName("age")
@Expose
private String age;

public User(String name, String age) {
    this.name = name;
    this.age = age;
 }

public String getName() {
    return name;
 }

public void setName(String name) {
    this.name = name;
 }

public String getAge() {
    return age;
 }

public void setAge(String age) {
    this.age = age;
 }
}

UserRepository.java

public class UserRepository {

Context context;

public UserRepository(Context context) {
    this.context = context;
}

public void getUserList(){

          Retrofit retrofit = RetrofitClient.getInstance();
          ApiService apiService = retrofit.create(ApiService.class);

          Call<User> userList = apiService.getUser();

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

             Log.d("Response", String.valueOf(response.body()));
       }

              @Override
              public void onFailure(Call<User> call, Throwable t) {

                  Toast.makeText(context,t.getMessage(),Toast.LENGTH_LONG).show();
              }
          });
  }
}

MainActivity.java

public class MainActivity extends AppCompatActivity {

UserRepository userRepository;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    FloatingActionButton fab = findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent i = new Intent(MainActivity.this,AddUser.class);
            startActivity(i);
        }
    });

    userRepository = new UserRepository(this);

    userRepository.getUserList();
}

API响应

[
  {
    "name": "Link",
    "age": "5"
  },
  {
    "name": "Rhea",
    "age": "24"
  },
  {
    "name": "Don",
    "age": "10"
  },
  {
    "name": "oman",
    "age": "30"
  },
  {
    "name": "Ron",
    "age": "18"
  },
  {
    "name": "roman",
    "age": "25"
  }
]

有人请告诉我为什么上面的异常显示我做错了什么。任何帮助将不胜感激。

谢谢

expected BEGIN_OBJECT but was BEGIN_ARRAY不是很明确吗?

这是因为该数组没有名称,它以 [ 开头,而不是 { ...

有效 JSON(正如 GSON 所预期的那样)看起来像这样:

{
    "users": [
        {"name": "Link","age": "5"},
        {"name": "Rhea","age": "24"},
        {"name": "Don","age": "10"},
        {"name": "oman", "age": "30"},
        {"name": "Ron", "age": "18"},
        {"name": "roman", "age": "25"}
    ]
}

如果您无法更改 API,则拦截调用并在映射之前修复输入 JSON。

return类型也是错误的,因为那应该是ArrayList<User>.

PS:顶级数组 users 需要它自己的数据模型。

您的 JSON 数据是一组用户对象,但您正试图解析单个用户对象。使用 List 表示您要解析 User 对象数组,如下面的 UserRepository class:

public void getUserList() {

          Retrofit retrofit = RetrofitClient.getInstance();
          ApiService apiService = retrofit.create(ApiService.class);

          Call<List<User>> userList = apiService.getUser();

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

             Log.d("Response", String.valueOf(response.body()));
       }

              @Override
              public void onFailure(Call<List<User>> call, Throwable t) {

                  Toast.makeText(context,t.getMessage(),Toast.LENGTH_LONG).show();
              }
          });
  }

您的 ApiService 接口也应该反映这一点。

public interface ApiService {

@GET("getUsers")
Call<List<User>> getUser();

}

在你的 ApiService 接口中你写了这个

@GET("getUsers")
Call<User> getUser();

但根据您的 json 回复,您确实需要一个用户列表,而不是单个用户

@GET("getUsers")
Call<List<User>> getUser();

也在 UserRepository class 中,您应该有这样的东西。

public class UserRepository {

Context context;

public UserRepository(Context context) {
    this.context = context;
}

public void getUserList(){

      Retrofit retrofit = RetrofitClient.getInstance();
      ApiService apiService = retrofit.create(ApiService.class);

      Call<List<User>> userList = apiService.getUser();

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

         Log.d("Response", String.valueOf(response.body()));
   }

          @Override
          public void onFailure(Call<List<User>> call, Throwable t) {

              Toast.makeText(context,t.getMessage(),Toast.LENGTH_LONG).show();
          }
      });
 }
}