GSON: Expected BEGIN_OBJECT but was BEGIN_ARRAY

201 阅读1分钟

json

假设json内容如下:

{"goods":[{"goodsName":"name-0","goodsPrices":0},{"goodsName":"name-1","goodsPrices":1},{"goodsName":"name-2","goodsPrices":2}]}

bean定义

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Bean {

    private Goods goods;

    @Data
    @Builder
    @AllArgsConstructor
    @NoArgsConstructor
    public static class Goods {
        private String goodsName;
        private Integer goodsPrices;
    }

}

测试代码

    @Test
    public void test() {
        Gson gson = new Gson();

        String json = "{\"goods\":[{\"goodsName\":\"name-0\",\"goodsPrices\":0},{\"goodsName\":\"name-1\",\"goodsPrices\":1},{\"goodsName\":\"name-2\",\"goodsPrices\":2}]}";
        System.out.println(json);

        // 1. Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 11 path $.goods
        // Bean bean = gson.fromJson(json, Bean.class);
        // System.out.println(bean);

        // 2. Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $
        // Bean[] beans = gson.fromJson(json, Bean[].class);
        // System.out.println(beans);
    }

Expected BEGIN_OBJECT but was BEGIN_ARRAY

先 解注释 第1点,注释掉 第2点,抛出如下异常:

Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 11 path $.goods

字面含义:期望类型是BEGIN_OBJECT但实际是BEGIN_ARRAY。

这里主要是明白是谁期望?? 期望的主语的 程序员,"实际"是指 要被反序列化的json串。

gson比较好的还指出了反序列化时出问题的地点: .goods节点处。(其中.goods节点处。 (其中表示json串的开始位置)。

结论

该json串中goods是个数组,但是java bean中,goods是个对象,因此提示:Expected BEGIN_OBJECT but was BEGIN_ARRAY。

Expected BEGIN_ARRAY but was BEGIN_OBJECT

注释掉 第1点,解注释 第2点。抛出如下异常:

Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $

java代码,期望是Bean[].class,但json串中实际是个对象。并且给出了json串出问题的位置:$(起始位置)