Java gson 错误 : Expected BEGIN_OBJECT but was BEGIN_ARRAY (but my type map is correct? )

标签 java json gson

我收到一个 gson 异常:应为 BEGIN_OBJECT 但实际为 BEGIN_ARRAY。但是,我不清楚为什么,因为我表示的结构是正确的。

我的数据:

[
    {
        "aws.amazon.com": 426788
    },
    {
        "atsv2-fp.wg1.b.yahoo.com": 141154
    },
    {
        "e2svi.x.incapdns.net": 140445
    },
    {
        "stackoverflow.com": 87624
    },
    {
        "a-sg03sl05.insnw.net": 56665
    }
]

我的 gson 对象:

public class GroupedTotals {
    public List<Map<String, Float>> BSRecvDestDNSName;
}

用法:

Gson gson = new Gson();
GroupedTotals groupedTotals = gson.fromJson(output, GroupedTotals.class);

异常(exception):

Parse Error: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2

有什么建议吗?如果我将代码和 json 更改为没有封装数组的映射,它可以正常工作,但我需要它才能像我上面写的那样使用数组。

最佳答案

那是因为 GroupedTotals 不是一个列表,它是一个包含列表的对象。

将转换为该类实例的有效 json 看起来像

{
    "BSRecvDestDNSName": [
       ...
    ]
}

或者,您可以获得列表的 Type 并直接转换为它。例如,使用您的原始 json,此代码:

Type type = new TypeToken<List<Map<String, Float>>>() {}.getType();
List<Map<String, Float>> myList = gson.fromJson(output, type);
System.out.println("myList='"+myList+"'");

输出

myList='[{aws.amazon.com=426788.0}, {atsv2-fp.wg1.b.yahoo.com=141154.0}, {e2svi.x.incapdns.net=140445.0}, {stackoverflow.com=87624.0}, {a-sg03sl05.insnw.net=56665.0}]'

关于Java gson 错误 : Expected BEGIN_OBJECT but was BEGIN_ARRAY (but my type map is correct? ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45558308/

相关文章:

ios - 使用 NSDictionary 创建模型对象

javascript - 当我将它传递给客户端时,JSON 对象架构看起来不同

jquery - jquery 中的链接函数,以便一个函数在另一个函数完成后开始

java - 将 json 响应转换为 null 或 void 对象

java - Gson 和 CSV 冲突?

java - Setter 注释在 Java 类中不起作用

java - MySQL根据一年中的一个月获取所有记录

java - 将 Paypal Checkout 交易转换为 Java 对象?

Java 8 流 - 增量收集/部分减少/间歇映射/...这甚至叫什么?

java - 委托(delegate)+部分覆盖的设计模式名称