如何使用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
相关产品推荐
相关产品推荐

