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

如何使用Gson库解析JSON数组对象及现有代码问题排查

现有代码问题梳理

  • 流读取逻辑错误:直接调用InputStream.toString()只能拿到InputStream对象的内存地址字符串,无法读取到raw文件里的实际JSON内容。
  • 实体类不符合Gson要求:Student类仅提供了带参构造方法,Gson反序列化时需要通过反射调用无参构造创建实例,缺少无参构造会直接抛出实例化异常。
  • JSON格式不规范:若JSON文件开头的/* This is my json file */注释实际存在,标准JSON语法不支持这类注释,会触发解析失败。

正确实现方案

1. 清理JSON文件

删除raw目录下JSON文件的注释,最终内容如下:

{
"firstname": [
"rohit",
"sagar",
"sandeep",
"rahul",
"sweta",
"priya"
]
}

2. 修正Student实体类

补充无参构造,可按需添加getter方法方便后续取值:

package com.example.gsonflow;

public class Student {
    private String[] firstname;

    // Gson反序列化必须的无参构造
    public Student() {
    }

    public Student(String[] firstname){
        this.firstname = firstname;
    }

    public String[] getFirstname() {
        return firstname;
    }
}

3. 修正MainActivity的解析逻辑

先正确读取输入流为JSON字符串,再交给Gson解析:

package com.example.gsonflow;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import com.google.gson.Gson;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Gson gson = new Gson();
        String jsonContent = null;
        // 正确读取raw文件内容
        try (InputStream inputStream = getResources().openRawResource(R.raw.safas);
             BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) {
            StringBuilder stringBuilder = new StringBuilder();
            String line;
            while ((line = reader.readLine()) != null) {
                stringBuilder.append(line);
            }
            jsonContent = stringBuilder.toString();
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 解析JSON
        if (jsonContent != null) {
            Student student = gson.fromJson(jsonContent, Student.class);
            // 测试输出解析结果
            for (String name : student.getFirstname()) {
                Log.d("解析结果", "姓名:" + name);
            }
        }
    }
}

额外说明:纯外层JSON数组的解析方式

如果待解析的JSON最外层是数组格式(没有外层对象包裹,比如["rohit","sagar"]),需要借助TypeToken指定解析类型:

import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
import java.util.List;

// 解析逻辑
Type listType = new TypeToken<List<String>>(){}.getType();
List<String> nameList = gson.fromJson(jsonContent, listType);

内容的提问来源于stack exchange,提问作者Rohit Kashyap

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 18:36:04