在使用高德地图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-CSDN博客

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;
    }
}

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

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Vue3中使用高德地图的逆地理编码,可以按照以下步骤进行: 1. 在项目中引入高德地图的JS API,可以在index.html中添加以下代码: ```html <script src="https://webapi.amap.com/maps?v=1.4.15&key=您申请的key值"></script> ``` 2. 在Vue3的组件中,可以使用`mounted`钩子函数来初始化地图,并获取当前位置的经纬度: ```javascript mounted() { var map = new AMap.Map('map-container', { zoom: 13 }); var geolocation = new AMap.Geolocation({ enableHighAccuracy: true, // 是否使用高精度定位,默认为false timeout: 10000, // 超过10秒后停止定位,默认:无穷大 }); geolocation.getCurrentPosition(function(status, result) { if (status == 'complete') { var lng = result.position.lng; var lat = result.position.lat; // 在这里可以进行逆地理编码 } else { console.log('定位失败'); } }); } ``` 3. 获取到当前位置的经纬度后,可以使用`AMap.Geocoder`类进行逆地理编码,从而获取当前位置的地址信息: ```javascript var geocoder = new AMap.Geocoder({ city: "全国", // 城市,默认:“全国” radius: 1000 // 范围,默认:500 }); geocoder.getAddress([lng, lat], function(status, result) { if (status == 'complete' && result.regeocode) { var address = result.regeocode.formattedAddress; console.log(address); } else { console.log('逆地理编码失败'); } }); ``` 在上述代码中,`[lng, lat]`表示当前位置的经纬度数组,`result.regeocode.formattedAddress`表示逆地理编码后获取到的地址信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值