You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 03:35:29