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