将JSON字符串转换为对象会返回“预期的BEGIN_ARRAY但为STRING”

时间:2018-09-28 14:01:28

标签: java android json gson

我从服务器返回的JSON响应格式为:

[
    {
        "id": "one",
        "values": {
            "name": "John",
        }
    },
    {
        "id": "two",
        "values": {
            "name": "Bob",
        }
    }
]

这是我设置的课程:

public class TestClass implements Serializable {

    @SerializedName("id")
    private String id;

    @SerializedName("values")
    private List<String> values;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public List<String> getValues() {
        return values;
    }

    public void setValues(List<String> values) {
        this.values = values;
    }
}

这是我的代码,用于将JSON解析为对象列表:

String response = serverResponseHere;
Gson gson = new Gson();
String json = gson.toJson(response);

Type collectionType = new TypeToken<List<TestClass>>(){}.getType();
List<TestClass> values = gson.fromJson(json, collectionType);

但是,出现以下错误:

  

com.google.gson.JsonSyntaxException:java.lang.IllegalStateException:预期为BEGIN_ARRAY,但为STRING

这是怎么回事?

2 个答案:

答案 0 :(得分:0)

您正在获取JSON响应内容

String response = serverResponseHere;

并将其转换为JSON

Gson gson = new Gson();
String json = gson.toJson(response);

这将生成一个包含您的内容的JSON字符串。看起来像

"[\n    {\n        \"id\": \"one\",\n        \"values\": {\n            \"name\": \"John\",\n        }\n    },\n    {\n        \"id\": \"two\",\n        \"values\": {\n            \"name\": \"Bob\",\n        }\n    }\n]\n"

当您尝试将其反序列化为List<TestClass>时,它显然会失败,因为它是JSON字符串而不是JSON数组。

在反序列化内容之前,请勿将您的内容序列化为JSON,因为它已经是JSON。


其他人提到了这一点,您的values字段与JSON内容不匹配。有关如何解决此问题,请参见此处:

答案 1 :(得分:-2)

从更改服务器响应json:

[
    {
        "id": "one",
        "values": {
            "name": "John",
        }
    },
    {
        "id": "two",
        "values": {
            "name": "Bob",
        }
    }
]

收件人:

[
    {
        "id": "one",
        "values": [
            {"name": "John"}
        ]
    },
    {
        "id": "two",
        "values": [
            {"name": "Bob"}
        ]
    }
]