如何在 android 中使用 Gson 或 VOlley 从 json 中删除空值

How to remove Empty value from json using Gson or VOlley in android

我试图在使用 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;
    }

}

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

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

您好,我认为第一种方法是跳过空键,只将 not-empty 值发送到 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);

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

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);
    }