【问题标题】:How to remove Empty value from json using Gson or VOlley in android如何在 android 中使用 Gson 或 VOLley 从 json 中删除空值
【发布时间】:2021-01-21 05:17:37
【问题描述】:

我试图在使用 GSON 将其发送到 RecyclerView 之前从 JSON 中删除空节点,但未能实现。

我的 JSON 文件如下所示:

{
 "text": [
   {
            "count": ,
            "word": "",
            "name": "",
            "score": ,
            "Words": "",
            "seek": 
        }
       {
            "count": 6,
            "word": "prp_għaċ-",
            "name": "prp_għaċ-",
            "score": 9.1,
            "Words": "kol",
            "seek": 2231297 
        }
  ]
}

MainActivity.java

 JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, getUrl, null, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                Gson gson = new GsonBuilder().create();
                Example example = gson.fromJson(response.toString(),Example.class);
                Log.i(TAG, "onResponse Hit");
                recyclerView.setAdapter(new UserAdapter(MainActivity.this, example.getText()));
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Toast.makeText(MainActivity.this, error.getMessage(), Toast.LENGTH_SHORT).show();
                Log.e("MainActivity", "onErrorResponse: "+ error.getMessage());
            }
        });

        RequestQueue requestQueue = Volley.newRequestQueue(this);
        requestQueue.add(request);
    }

Adapter.java

 public UserViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.items_text_list,parent,false);
        return new UserViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull UserViewHolder holder, int position) {
        holder.getData(text.get(position));
    }

    @Override
    public int getItemCount() {
        return text.size();
    }

    class UserViewHolder extends RecyclerView.ViewHolder {

        TextView textView;
        public UserViewHolder(@NonNull View itemView) {
            super(itemView);

            textView = itemView.findViewById(R.id.text121);

        }
        public void getData(Text text){
            if (text.getCount().toString() != "") {
                textView.setText(user.getCount().toString());
            }
        }

Example.java

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

import java.util.List;

public class Example {

    @SerializedName("Text")
    @Expose
    private List<Text> text= null;

    public List<Text> getText() {
        return text;
    }

    public void setText(List<Text> text) {
        this.text= text;
    }

}

我想在将 null 值发送到 recyclerView 之前删除它。

请帮助我找到正确的解决方案。谢谢

【问题讨论】:

  • 检查键word是否为空,跳过它。在将数据添加到列表时提供您的代码。
  • 我可以看看你的示例课程吗?
  • @ErwinKurniawanA 添加

标签: android json android-studio android-recyclerview gson


【解决方案1】:

让我们创建一个没有空数据的新列表。

JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, getUrl, null, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                Gson gson = new GsonBuilder().create();
                Example example = gson.fromJson(response.toString(),Example.class);
                ArrayList<Text> newList = new ArrayList<>();
                for (int i = 0; i < example.getText().size(); i++) {
                     if (!example.getText().get(i).getWord().isEmpty()) { // check if word is not empty then add to the new list
                         newList.add(example.getText().get(i));
                     }
                }
                Log.i(TAG, "onResponse Hit");
                recyclerView.setAdapter(new UserAdapter(MainActivity.this, newList)); // use the filtered list
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Toast.makeText(MainActivity.this, error.getMessage(), Toast.LENGTH_SHORT).show();
                Log.e("MainActivity", "onErrorResponse: "+ error.getMessage());
            }
        });

        RequestQueue requestQueue = Volley.newRequestQueue(this);
        requestQueue.add(request);
    }

【讨论】:

    【解决方案2】:

    Hi 认为第一种方法是跳过为空的键,只将非空值发送到 recyclerView。 或者是这样的:

    String json = .... // your json
      Type type = new TypeToken<Map<String, Object>>() {}.getType();
       Map<String, Object> data = new Gson().fromJson(json, type);
    
       for (Iterator<Map.Entry<String, Object>> it = data.entrySet().iterator(); it.hasNext();) {
                Map.Entry<String, Object> entry = it.next();
                if (entry.getValue() == null) {
                    it.remove();
                } else if (entry.getValue().getClass().equals(ArrayList.class)) {
                    if (((ArrayList<?>) entry.getValue()).size() == 0) {
                        it.remove();
                    }
                }
            }
    
        String json1 = new GsonBuilder().setPrettyPrinting().create().toJson(data);
        System.out.println("Latest json "+json1);
    

    【讨论】:

    • 感谢您的回答,但我正在通过服务器的链接解析嵌套的 JSON。所以,问题是如何将我的 JSON 转换为字符串?如果我再次这样做,我需要在将其转换为适配器类之前将其转换为 Text.java 类,它会出现一些问题,请查看我的代码。
    猜你喜欢
    • 2014-07-18
    • 1970-01-01
    • 2020-11-11
    • 1970-01-01
    • 2016-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-22
    相关资源
    最近更新 更多