【问题标题】:using POJO Class with the GSON将 POJO 类与 GSON 一起使用
【发布时间】:2023-03-12 17:52:01
【问题描述】:

我正在创建一个带有 Json 示例数组的项目,我已经生成了 POJO 类,并且我有一个需要解析的 JSON。我已经完成了所有设置,但应用程序没有显示任何错误,也没有显示应用程序内的任何数据。 这是我生成的 POJO 类。

 public class Android {

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

public String getVer() {
    return ver;
}

public void setVer(String ver) {
    this.ver = ver;
}

public String getName() {
    return name;
}

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

public String getApi() {
    return api;
}

public void setApi(String api) {
    this.api = api;
     }

     }

 public class    AndroidVersion {

@SerializedName("android")
@Expose
private List<Android> android = null;

public List<Android> getAndroid() {
    return android;
}

public void setAndroid(List<Android> android) {
    this.android = android;
}

   }

我的 Json 就像

{
  "android": [
    {
      "ver": "1.5",
      "name": "Cupcake",
      "api": "API level 3"
    },
    {
      "ver": "1.6",
      "name": "Donut",
      "api": "API level 4"
    },
    {
      "ver": "2.0 - 2.1",
      "name": "Eclair",
      "api": "API level 5 - 7"
    }
  ]
}

我已经解析了如下所示的数据

 private void getInformation(){
    StringRequest stringRequest=new StringRequest(Request.Method.GET, URL, new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {


            Gson gson=new GsonBuilder().create();
            try {
                JSONObject jsonObject=new JSONObject(response);
                JSONArray jsonArray=jsonObject.getJSONArray("android");
                Android averion= gson.fromJson(jsonObject.toString(),Android.class);

                List<Android> verionlist=new ArrayList<>();
                verionlist.add(averion);
                adapter=new ReccyclerAdapter(verionlist);
                recyclerView.setAdapter(adapter);

            } catch (JSONException e) {
                e.printStackTrace();
            }


        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {

        }
    });
    MySingleton.getInstance(this).addToRequestQueue(stringRequest);
}

谁能告诉我我的代码有什么问题。 y 它没有显示数据。 如果你知道任何博客或网站来了解如何在 android 中将 POJO 与所有类型的 JSON 一起使用

这是适配器类。

    public class ReccyclerAdapter extends 
  RecyclerView.Adapter<ReccyclerAdapter.MYViewHolder> {
private String TAG=getClass().getSimpleName();
private List<Android> list=new ArrayList<>();
ReccyclerAdapter(List<Android> list){
    this.list=list;

}

@NonNull
@Override
public MYViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    View view=LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.data_row,viewGroup,false);
    return new MYViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull MYViewHolder myViewHolder, int i) {

    myViewHolder.api_level.setText(list.get(i).getApi());
    myViewHolder.name.setText(list.get(i).getName());
    myViewHolder.version.setText(list.get(i).getVer());

}


@Override
public int getItemCount() {
    return list.size();
}
public static class MYViewHolder extends RecyclerView.ViewHolder {
    TextView version,name,api_level;
    public MYViewHolder(@NonNull View itemView) {
        super(itemView);
        name=(TextView)itemView.findViewById(R.id.name);
        version=(TextView)itemView.findViewById(R.id.vesrion);
        api_level=(TextView)itemView.findViewById(R.id.api_level);

    }
}
 }

【问题讨论】:

  • 你确定它没有进入Response.ErrorListener()
  • 没有响应字符串显示数据。我想我有问题将数据传递给 pojo 类并显示

标签: android json gson pojo


【解决方案1】:

将这个 Android averion= gson.fromJson(jsonObject.toString(),Android.class); 代码放在一个 for 循环中,例如:

这个JSONObject jsonObject=new JSONObject(response); 在 obj 的 0,1 和 2 个位置上的响应不是 obj。

 List<Android> verionlist=new ArrayList<>();

在或创建activity中创建新的ArrayList

然后使用for循环将android数组中的每个对象添加到arraylist中,例如:

for(int i=0;i<jsonArray.length(); i++){
  Android averion= gson.fromJson(jsonArray.get(i).toString(),Android.class);
  verionlist.add(averion);
}

 adapter=new ReccyclerAdapter(verionlist);
 recyclerView.setAdapter(adapter);

它会为你工作。

【讨论】:

  • 是的,感谢它现在显示数据,问题是卡片视图正在获取整个数据。
【解决方案2】:

您无需经历将每个 JSON 对象单独添加到列表中的痛苦。相反,更好的方法是使用 TypeToken 直接转换响应字符串。 Gson 库允许您简单地执行此操作,如下所示:

Gson gson = new Gson();

Type type = new TypeToken<List<Android>>() {}.getType();

List<Android> versionList = gson.fromJson(response, type);

或者如果你想用一行代码完成你的任务

List<Android> versionList = new Gson().fromJson(response, new TypeToken<List<Android>>() {}.getType());

【讨论】:

  • 如果我使用您的建议,我会收到错误消息:com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY 但 BEGIN_OBJECT 在第 1 行第 2 列路径 $
  • 这是因为响应字符串代表的是一个json对象而不是一个json数组。
  • 所以对于使用 GSON,JSON 应该以数组而不是对象开头。
  • 没有。字符串可以是其中任何一个。但是,您想将字符串转换为列表,因此 gson 将期望 JSON 数组字符串表示。您期望的响应类型必须更改。如果您不想更改它,则需要更改您的 pojo 类,因为它们应该彼此正确映射
  • 我的建议是你把你的回复改成这样: [ { "ver": "1.5", "name": "Cupcake", "api": "API level 3" }, { "版本:“1.6”,“名称”:“甜甜圈”,“api”:“API 级别 4”},{“版本”:“2.0 - 2.1”,“名称”:“Eclair”,“api”:“ API 级别 5 - 7" } ]
【解决方案3】:

试试这个

 Gson gson = new Gson();
            try {
                JSONObject jsonObject=new JSONObject(response);
                JSONArray jsonArray=jsonObject.getJSONArray("android");



                Android averion= gson.fromJson(jsonObject.toString(),Android.class);
                 //here jsonObject.toString() is  your AndroidVersion not Android .

                List<Android> verionlist=new ArrayList<>();
                verionlist.add(averion);
                adapter=new ReccyclerAdapter(verionlist);
                recyclerView.setAdapter(adapter);

            } catch (JSONException e) {
                e.printStackTrace();
            }

【讨论】:

  • 不,您的解决方案不起作用。但我需要你说的解决方案。我不想进行任何循环来设置 pojo 类
  • 请告诉我在哪里可以查看如何使用生成的 POJO 类解析不同的 JSON
  • @koteswaraDK 你把List&lt;Android&gt; verionlist改成AndroidVersion model = new AndroidVersion然后model.setAndroid
  • 如果可能的话,请您纠正我的错误并发布您的解决方案
【解决方案4】:

我找到了我想要的答案。这是解决方案

   Gson gson = new Gson();

    AndroidVersion generalInfoObject = gson.fromJson(response, AndroidVersion.class);

    adapter=new ReccyclerAdapter(generalInfoObject.getAndroid());
    recyclerView.setAdapter(adapter);

我将 Android 版本类更改为

 public class  AndroidVersion {

 @SerializedName("android")
 List<Android> android;

 public List<Android> getAndroid() {
    return android;
 }

 public void setAndroid(List<Android> android) {
    this.android = android;
 }

 }

感谢您为我提供解决方案提示

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-03
    相关资源
    最近更新 更多