刚刚开始我还很懵逼不知道怎么回事,以为是我不小心改那个实体类 结果发现是高德地图 发送过来的数据有问题 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;
}
}
这样就可以不管什么情况下都会是正常的