Android中解析JSON文件并跳过含null值项的实现方法
问题:Gson解析JSON数组时抛出异常并过滤无效项
需求与异常
需要将给定的JSON数组解析为Item对象,并跳过name为null或空字符串的项,但解析时抛出以下异常:
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 2 column 2 path $[0]
当前代码可读取文件内容,但无法完成对象解析。
原始JSON片段
[{"id": 755, "listId": 2, "name": ""},{"id": 203, "listId": 2, "name": ""},{"id": 684, "listId": 1, "name": "Item 684"},{"id": 276, "listId": 1, "name": "Item 276"},{"id": 736, "listId": 3, "name": null},{"id": 926, "listId": 4, "name": null},{"id": 808, "listId": 4, "name": "Item 808"}]
尝试过的代码
private String deserializeItem() throws IOException, JSONException { String itemText = ""; //Item item = new Item(); Gson gson = new Gson(); InputStream is = getAssets().open("JSONFile.json"); String jsonTxt = IOUtils.toString(is, "UTF-8"); //Map map = gson.fromJson(jsonTxt, Map.class); //Map<String,Item> map = new HashMap<String, Item>(); //map = (Map<String,Item>) gson.fromJson(jsonTxt, map.getClass()); //List<Item> itemList = Arrays.asList(gson.fromJson(jsonTxt, Item[].class)); //Item item = gson.fromJson(jsonTxt, Item.class); JsonElement json = gson.fromJson(new FileReader("fetchJSONFile.json"), JsonElement.class); String result = gson.toJson(json); System.out.println(jsonTxt); //JSONObject json = new JSONObject(jsonTxt); //String a = json.getString("1000"); //System.out.println(a); return itemText; }
解决方法
1. 确保Item实体类定义正确
首先要保证Item类的字段与JSON结构完全匹配,且包含无参构造函数(Gson解析必需):
public class Item { private int id; private int listId; private String name; public Item() {} // Getter和Setter方法 public int getId() { return id; } public void setId(int id) { this.id = id; } public int getListId() { return listId; } public void setListId(int listId) { this.listId = listId; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
2. 修正解析逻辑,统一文件读取
之前的异常大概率是因为同时读取了两个不同的JSON文件(assets中的JSONFile.json和本地的fetchJSONFile.json),若本地文件格式错误(比如是单个对象而非数组),就会抛出数组/对象不匹配的错误。统一使用assets中的正确文件内容解析:
3. 解析数组并过滤无效项
将JSON字符串解析为Item数组后,转换为List并过滤掉name为null或空字符串的项:
private List<Item> deserializeItem() throws IOException { Gson gson = new Gson(); // 读取assets中的JSON文件 InputStream is = getAssets().open("JSONFile.json"); String jsonTxt = IOUtils.toString(is, "UTF-8"); // 解析为Item数组 Item[] itemsArray = gson.fromJson(jsonTxt, Item[].class); // 过滤有效项:name不为null且非空 List<Item> validItems = Arrays.stream(itemsArray) .filter(item -> item.getName() != null && !item.getName().isEmpty()) .collect(Collectors.toList()); // 验证结果(可选) validItems.forEach(item -> System.out.println("ID: " + item.getId() + ", Name: " + item.getName())); return validItems; }
内容的提问来源于stack exchange,提问作者Tiana
相关产品推荐
相关产品推荐

