首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用改进解析回收视图中的嵌套JSON对象会产生错误:“预期的begin数组,但在第1行是BEGIN_OBJECT

使用改进解析回收视图中的嵌套JSON对象会产生错误:“预期的begin数组,但在第1行是BEGIN_OBJECT
EN

Stack Overflow用户
提问于 2022-01-29 09:28:06
回答 2查看 120关注 0票数 2

所以我试图把JSON数据解析到我的回收视图中。但是错误地说:“预期的begin数组但是BEGIN_OBJECT在第1行”

我的JSON响应:

代码语言:javascript
复制
{
    "status": "success",
    "data": {
        "0": {
            "id": "8",
            "name": "hmhshwv",
            "description": "vhhh",
            "location": "nhhjj"
        },
        "1": {
            "id": "54",
            "name": "mabwb",
            "description": "ywg",
            "location": "gwgw"
        }
        "2": {
            "id": "48",
            "name": "nnf",
            "description": "gwb",
            "location": "wggw"
        }
    }
}

我的模范班:

代码语言:javascript
复制
public class DataModel {

    private String id;
    private String firstname;
    private String lastname;
    private String contact;


    public DataModel(String id, String firstname, String lastname, String contact) {
        this.id = id;
        this.firstname = firstname;
        this.lastname = lastname;
        this.contact = contact;
    }

    public String getId() {
        return id;
    }

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

    public String getFirstname() {
        return firstname;
    }

    public void setFirstname(String firstname) {
        this.firstname = firstname;
    }

    public String getLastname() {
        return lastname;
    }

    public void setLastname(String lastname) {
        this.lastname = lastname;
    }

    public String getContact() {
        return contact;
    }

    public void setContact(String contact) {
        this.contact = contact;
    }
}

我的apiInterface: api有body参数,如apikey、userid和storeid。

代码语言:javascript
复制
public interface MyApiCall {

    @Headers("Accept: application/json")
    @POST("mybiz/api/staff-list")
    Call<List<DataModel>> getDataModel(
        @Body String apikey,
        @Body String userid,
        @Body String storeid
    );
}

我的RetrofitClient课程:

代码语言:javascript
复制
public class RetrofitClient {

    private static final String BASE_URL = "https://api.pidu.in/";
    private static Retrofit retrofit = null;
    public static MyApiCall getRetrofitClient() {
        if(retrofit == null) {
            retrofit = new Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
        }
        return retrofit.create(MyApiCall.class);
    }
}

我的MainActivity

代码语言:javascript
复制
private static final String TAG = MainActivity.class.getSimpleName();
private static final String apikey = "somethinggg";
private static final String userid = "a number";
private static final String storeid = "158";

RecyclerView recyclerView;
ProgressBar progressBar;
LinearLayoutManager linearLayoutManager;
DataModelAdapter dataModelAdapter;
List<DataModel> dataModels = new ArrayList<>();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
    progressBar = (ProgressBar) findViewById(R.id.progressBar3);
    linearLayoutManager = new LinearLayoutManager(this);
    recyclerView.setLayoutManager(linearLayoutManager);
    dataModelAdapter = new DataModelAdapter(dataModels);
    recyclerView.setAdapter(dataModelAdapter);

    fetchDataModel();

}

private void fetchDataModel() {

    progressBar.setVisibility(View.VISIBLE);
    RetrofitClient.getRetrofitClient().getDataModel(apikey, userid, storeid).enqueue(new Callback<List<DataModel>>() {

        @Override
        public void onResponse(@NonNull Call<List<DataModel>> call, @NonNull Response<List<DataModel>> response) {
            if(response.isSuccessful() && response.body() != null) {

                Log.e(TAG, "Error: " + response.body());
                dataModels.addAll(response.body());
                dataModelAdapter.notifyDataSetChanged();
                progressBar.setVisibility(View.GONE);

            }
        }

        @Override
        public void onFailure(@NonNull Call<List<DataModel>> call, @NonNull Throwable t) {
            Toast.makeText(MainActivity.this, "Error: " + t.getLocalizedMessage(), Toast.LENGTH_LONG).show();
        }
    });
}

作为参考,我的hoppscotch api看起来如下:

hoppscotch api

我知道我应该解析JSON对象,但是找不到一种特殊的方法。

EN

回答 2

Stack Overflow用户

发布于 2022-01-29 10:13:36

您的getDataModel()正在请求一个List<DataModel>,但是服务器的响应是返回一个Object

例如,您应该创建一个名为Response的新类,如下所示:

代码语言:javascript
复制
public class Response {

   private String status;
   private Map<String, DataModel> data;

   public Response(String status, Map<String, DataModel> data) {
      this.status = status;
      this.data = data;
   }

   public String getStatus() {
      return status;
   }

   public void setStatus(String status) {
      this.status = status;
   }

   public Map<String, DataModel> getData() {
      return data;
   }

   public void setData(Map<String, DataModel> data) {
      this.data = data;
   }
}

你的要求是这样的:

代码语言:javascript
复制
public interface MyApiCall {

    @Headers("Accept: application/json")
    @POST("mybiz/api/staff-list")
    Call<List<Response>> getDataModel(
        @Body String apikey, 
        @Body String userid,   
        @Body String storeid
    );
}
票数 1
EN

Stack Overflow用户

发布于 2022-01-29 10:28:28

我认为您的JSON格式无效。无法处理对象中的对象列表。应该是一份名单。就像这样:

代码语言:javascript
复制
{
"status": "success",
"data": [
   {
        "id": "8",
        "name": "hmhshwv",
        "description": "vhhh",
        "location": "nhhjj"
    },
     {
        "id": "54",
        "name": "mabwb",
        "description": "ywg",
        "location": "gwgw"
    },
     {
        "id": "48",
        "name": "nnf",
        "description": "gwb",
        "location": "wggw"
    }
  ]
}

数据模型类是:

代码语言:javascript
复制
import java.util.List;

public class DataModel {

    private String status;
    private List<Datum> data = null;

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public List<Datum> getData() {
        return data;
    }

    public void setData(List<Datum> data) {
        this.data = data;
    }

}
class Datum {
    private String id;
    private String name;
    private String description;
    private String location;

    public String getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String getLocation() {
        return location;
    }

    public void setLocation(String location) {
        this.location = location;
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70903950

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档