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();
}
});
}
}
我正在使用改装网络库从 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();
}
});
}
}