在使用高德地图api里面的地理编码JSON解析 building里面的问题

刚刚开始我还很懵逼不知道怎么回事,以为是我不小心改那个实体类 结果发现是高德地图 发送过来的数据有问题  bug是这样的  

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING at line 1 column 455 path $.regeocode.addressComponent.building.name
See https://github.com/google/gson/blob/main/Troubleshooting.md#unexpected-json-structure


大致是因为接收到的参数类型和申明定义的参数类型不一致造成的。我看了一下,他发过来的和我接收的,我使用的是 接收发生是这样的

GeoResponse  advertiseEntity = new Gson().fromJson(response, GeoResponse.class);
 "building": {
                "name": [],
                "type": []
            },
public class Building {

    private List<String> name;

    private List<String> type;

    public List<String> getName() {
        return name;
    }

    public void setName(List<String> name) {
        this.name = name;
    }

    public List<String> getType() {
        return type;
    }

    public void setType(List<String> type) {
        this.type = type;
    }

我就更疑惑了,直到我发现 ,我就明白了  有数据的时候就是字符串 。没有数据的时候就是 集合,给我看傻了

"building": {
                "name": "长丰工业园",
                "type": "商务住宅;产业园区;产业园区"
            },

我的解决办法,就是实现 自定义反序列化  ,好了废话不多说上代码,如果对这些自定义反序列化的不太了解可以看一下这个大佬的Jackson 2.x 系列【16】反序列化器 JsonDeserializer_jackson jsondeserializer-优快云博客

public class Building {
    @JsonAdapter(StringListAdapter.class)
    private List<String> name;
    @JsonAdapter(StringListAdapter.class)
    private List<String> type;

    public List<String> getName() {
        return name;
    }

    public void setName(List<String> name) {
        this.name = name;
    }

    public List<String> getType() {
        return type;
    }

    public void setType(List<String> type) {
        this.type = type;
    }
}
public class StringListAdapter implements JsonDeserializer<List<String>>, JsonSerializer<List<String>> {

    @Override
    public List<String> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        if (json.isJsonArray()) {
            JsonArray jsonArray = json.getAsJsonArray();
            List<String> list = new ArrayList<>();
            for (JsonElement element : jsonArray) {
                list.add(element.getAsString());
            }
            return list;
        } else if (json.isJsonPrimitive()) {
            JsonPrimitive primitive = json.getAsJsonPrimitive();
            if (primitive.isString()) {
                return new ArrayList<>(Arrays.asList(primitive.getAsString()));
            }
        }
        return new ArrayList<>();
    }

    @Override
    public JsonElement serialize(List<String> src, Type typeOfSrc, JsonSerializationContext context) {
        JsonArray array = new JsonArray();
        for (String s : src) {
            array.add(new JsonPrimitive(s));
        }
        return array;
    }
}

这样就可以不管什么情况下都会是正常的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值