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

Posted

技术标签:

【中文标题】如何在 android 中使用 Gson 或 VOLley 从 json 中删除空值【英文标题】:How to remove Empty value from json using Gson or VOlley in android 【发布时间】: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 添加 【参考方案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 类,它会出现一些问题,请查看我的代码。

以上是关于如何在 android 中使用 Gson 或 VOLley 从 json 中删除空值的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用 GSON 或 android 中的任何其他库的情况下使用改造以字符串形式获得响应 [重复]

如何在android中使用GSON解析json解析

如何在 Android 的 Kotlin 中使用 GSON 将 JSON 对象转换为 JSON 数组

如何将Gson附加功能添加到Android项目中?

Android Retrofit2:在没有 GSON 或 JSONObject 的情况下序列化 null

使用 GSON 和 Volley 在 Android 上显示 JSON 数据