Java 为什么Gson fromJson抛出JsonSyntaxException:应该是BEGIN\u对象,但却是BEGIN\u数组?

Java 为什么Gson fromJson抛出JsonSyntaxException:应该是BEGIN\u对象,但却是BEGIN\u数组?,java,json,gson,Java,Json,Gson,(这篇文章将是一篇文章,下面提供了一个示例答案。) 我正在尝试使用将一些JSON内容反序列化为自定义POJO类型 这段代码 import com.google.gson.Gson; public class Sample { public static void main(String[] args) { String json = "{\"nestedPojo\":[{\"name\":null, \"value\":42}]}"; Gson gso

(这篇文章将是一篇文章,下面提供了一个示例答案。)


我正在尝试使用将一些JSON内容反序列化为自定义POJO类型

这段代码

import com.google.gson.Gson;

public class Sample {
    public static void main(String[] args) {
        String json = "{\"nestedPojo\":[{\"name\":null, \"value\":42}]}";
        Gson gson = new Gson();
        gson.fromJson(json, Pojo.class);
    }
}

class Pojo {
    NestedPojo nestedPojo;
}

class NestedPojo {
    String name;
    int value;
}
抛出以下异常

Exception in thread "main" com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 16 path $.nestedPojo
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:200)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:103)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:196)
    at com.google.gson.Gson.fromJson(Gson.java:810)
    at com.google.gson.Gson.fromJson(Gson.java:775)
    at com.google.gson.Gson.fromJson(Gson.java:724)
    at com.google.gson.Gson.fromJson(Gson.java:696)
    at com.example.Sample.main(Sample.java:23)
Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 16 path $.nestedPojo
    at com.google.gson.stream.JsonReader.beginObject(JsonReader.java:387)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:189)
    ... 7 more

为什么Gson不能正确地将我的JSON文本转换为我的POJO类型?

正如异常消息所述

Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 16 path $.nestedPojo
在反序列化时,Gson需要一个JSON对象,但找到了一个JSON数组。由于无法从一个转换到另一个,因此引发了此异常

描述了JSON格式。简而言之,它定义了以下类型:对象、数组、字符串、数字、
null
,以及布尔值
true
false

在Gson(和大多数JSON解析器)中,存在以下映射:JSON字符串映射到Java
字符串;JSON编号映射到Java
编号
类型;JSON数组映射到
集合
类型或数组类型;JSON对象映射到Java
Map
类型,或者通常映射到自定义类型(前面没有提到)
null
映射到Java的
null
,布尔值映射到Java的
true
false

Gson遍历您提供的JSON内容,并尝试将其反序列化为您请求的相应类型。如果内容不匹配或无法转换为预期类型,它将抛出相应的异常

在您的例子中,您提供了以下JSON

{
    "nestedPojo": [
        {
            "name": null,
            "value": 42
        }
    ]
}
在根目录下,这是一个JSON对象,其中包含一个名为
nestedPojo
的JSON数组成员。该JSON数组包含一个元素,即另一个包含两个成员的JSON对象。考虑到前面定义的映射,您希望这个JSON映射到一个Java对象,该对象有一个名为
nestedPojo
的字段,属于某种
Collection
或array类型,其中该类型分别定义了两个名为
name
value
的字段

但是,您已经将
Pojo
类型定义为具有字段

NestedPojo nestedPojo;
这既不是数组类型,也不是集合类型。Gson无法反序列化此字段对应的JSON

相反,您有3个选项:

  • 更改JSON以匹配预期类型

    {
        "nestedPojo": {
            "name": null,
            "value": 42
        }
    }
    
  • 将您的
    Pojo
    类型更改为
    集合
    或数组类型

    List<NestedPojo> nestedPojo; // consider changing the name and using @SerializedName
    NestedPojo[] nestedPojo;
    
在json中有一个nestedPojo数组 所以要么你改变代码

  NestedPojo[] nestedPojo;
或者更改json字符串

String json = "{\"nestedPojo\":{\"name\":null, \"value\":42}}";

可能值得为反向错误添加第二个答案。应为数组,但为对象
  NestedPojo[] nestedPojo;
String json = "{\"nestedPojo\":{\"name\":null, \"value\":42}}";