尝试使用 GSON 解析 JSON 字符串失败。我使用 JDK 8、GSON V2.10.1(使用 IntelliJ,还有 VS Code)并确定了错误的来源。相关代码片段如下:
JSON:
{
"took" : 2,
"hits" : {
"total" : 19,
"max_score" : 1.0,
"hits" : [
{
"_index" : "layouts-new",
"_type" : "doc",
"_id" : "a0b8707c-feb3-4867-966d-33c435c82141",
"_score" : 1.0,
. . .
我写的代码片段:
Gson gson = new GsonBuilder().setLenient().create();
JSONObject jsonObject = gson.fromJson(json, JSONObject.class);
. . .
返回的jsonObject是{},为空。这意味着 JSON 中的任何元素都没有被解析。调试后发现有问题的行是
BoundField field = boundFields.get(name)
。它抛出了一个 NPE。该源代码来自包 public T read(JsonReader in) throws IOException
中 ReflectiveTypeAdapterFactory.java
的方法 com.google.gson.internal.bind
。
try {
in.beginObject();
while (in.hasNext()) {
String name = in.nextName();
BoundField field = boundFields.get(name);
if (field == null || !field.deserialized) {
in.skipValue();
} else {
readField(accumulator, in, field);
}
}
} catch (IllegalStateException e) {
知道罪魁祸首是什么或者我在哪里遗漏了什么吗?
提前致谢
JSONObject
不是来自 Gson 库。因此,Gson 没有内置适配器,并尝试使用反射进行反序列化,使用该 JSONObject
类的内部字段。
com.google.gson.JsonObject
来代替:
JsonObject jsonObject = gson.fromJson(json, JsonObject.class);