如何在 Android 中使用 GSON 解析 JSON 数据:错误解决
在 Android 中使用 GSON 解析 JSON 数据时,可能会遇到以下错误:“java.lang.IllegalStateException:预期为 BEGIN_OBJECT,但在第 1 行第 73 列为 NAME。”此错误表示 JSON 数据中存在语法问题,特别是缺少左大括号。
可能的解决方案
要解决此问题,请确保您的 JSON 数据正确格式化并包含左花括号和右花括号。例如:
<code class="json">{ "count": "12", "colbreak": 1, ... "seek": 0 }</code>
常见原因
此错误的一个常见原因是接收存储在文件中或作为字符串从服务器下载的 JSON 数据。在这种情况下,字符串可能未正确编码或添加前缀,这可能会导致解析错误。
自定义类修改
在您的代码中,您正在使用 Java反射创建自定义类 GsonParse 来表示 JSON 数据结构。一般不推荐这种方法。相反,为 GsonParse 中的每个字段创建显式的 getter 和 setter 方法。此外,使用 @SerializedName 注释类和字段名称以匹配 JSON 属性名称。
以下示例:
<code class="java">public class GsonParse { @SerializedName("count") private String count; @SerializedName("colbreak") private String colbreak; @SerializedName("name") private String name; @SerializedName("score") private String score; @SerializedName("Words") private List<Words> mWords = new ArrayList<>(); @SerializedName("seek") private String seek; // Add getters and setters here... }</code>
UTF-8 编码
确保您的 JSON 数据正确编码为 UTF-8 格式。通过 HTTP 接收 JSON 数据时,服务器应使用适当的 Content-Type 标头进行响应(例如“application/json; charset=utf-8”)。
改进的解析方法
这是使用 Reader 的解析方法的改进版本:
<code class="java">public static <T> ArrayList<T> JsonParse(T t, Reader reader) { ArrayList<T> lcs = new ArrayList<>(); try { Gson gson = new Gson(); JsonReader jsonReader = new JsonReader(reader); jsonReader.beginObject(); while (jsonReader.hasNext()) { T cse = (T) gson.fromJson(jsonReader, t.getClass()); lcs.add(cse); } jsonReader.endObject(); jsonReader.close(); } catch (UnsupportedEncodingException | IOException e) { e.printStackTrace(); } return (ArrayList<T>) lcs; }</code>
用法
要使用此方法,请从您的源(例如文件或 HTTP 响应)并将其传递给 JsonParse 方法:
<code class="java">InputStream ims = assetManager.open("file.txt"); Reader reader = new InputStreamReader(ims, "UTF-8"); ArrayList<GsonParse> gsonObjects = JsonParse(new GsonParse(), reader);</code>
以上是在 Android 中使用 GSON 解析 JSON 数据时,为什么会出现'java.lang.IllegalStateException:预期 BEGIN_OBJECT 但在第 1 行第 73 列为 NAME”错误?的详细内容。更多信息请关注PHP中文网其他相关文章!