Java gson错误:预计BEGIN_OBJECT但是BEGIN_ARRAY(但我的类型映射是正确的?)

时间:2017-08-08 02:19:12

标签: 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);

例外:

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

有什么建议吗?如果我将代码和json更改为没有封装数组的映射,它可以正常工作,但我需要它来处理数组,如上所述。

1 个答案:

答案 0 :(得分:3)

那是因为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}]'