将 JSON 字符串转换为对象返回“预期的 BEGIN_ARRAY 但为字符串”[重复]

Posted

技术标签:

【中文标题】将 JSON 字符串转换为对象返回“预期的 BEGIN_ARRAY 但为字符串”[重复]【英文标题】:Converting JSON string to object returns "Expected BEGIN_ARRAY but was STRING" [duplicate] 【发布时间】:2019-03-04 13:14:21 【问题描述】:

我有一个 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

这是怎么回事?

【问题讨论】:

根据您的值,它只是对象数组而不是列表字符串 将对象用作列表导致错误。这是正确的: = Type collectionType = new TypeToken().getType(); .你儿子也错了 【参考方案1】:

您正在获取 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&lt;TestClass&gt; 时,它显然会失败,因为它是 JSON 字符串而不是 JSON 数组。

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


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

Why does Gson fromJson throw a JsonSyntaxException: Expected BEGIN_OBJECT but was BEGIN_ARRAY?

【讨论】:

这应该是公认的答案。【参考方案2】:

从以下位置更改您的服务器响应 json:

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

收件人:

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

【讨论】:

还是不行,因为"name": "John" 不是字符串 这也不应该是因为它需要是 json 数组中的 json 对象。错误是它在预期数组的位置获取字符串。 List&lt;String&gt; 期望类似于 ["John", "Bob"]

以上是关于将 JSON 字符串转换为对象返回“预期的 BEGIN_ARRAY 但为字符串”[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何利用fastjson将JSON格式的字符串转换为Map,再返回至前端成为js对象

请问各位java中如何将数据库返回的多个字段值拼接为一个list并转换为json对象返回到前台,谢谢!

JavaScriptSerializer 不会将 Json 字符串转换为对象? [关闭]

如何将字符串数组转换为 JSON 对象?

将 JSON 字符串转换为对象并显示为 HTML 表格

jquery 怎么将json字符串转化为json对象