Cuando utilice la interfaz de Amap para obtener datos de información de la ciudad, debe utilizar gson para convertir el json entrante en un bean Java. El tipo de datos de los atributos del bean es único. Pero cuando realmente se analiza json, hay algunos datos: cuando hay datos, se pasa el tipo de cadena, cuando no hay datos, es [] (tipo de lista); o cuando hay datos, es [] (lista tipo), cuando no hay datos, se pasa [[]] (tipo de objeto). Por lo general, durante el análisis, se generará una excepción.
09-26 18:29:58.735 2834 4082 W System.err: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected a string but was BEGIN_ARRAY at line 1 column 225 path $.data.city.addressComponent.streetNumber.number
09-26 18:29:58.735 2834 4082 W System.err: at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:226)
09-26 18:29:58.735 2834 4082 W System.err: at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:131)
09-26 18:29:58.735 2834 4082 W System.err: at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:222)
09-26 18:29:58.735 2834 4082 W System.err: at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:131)
09-26 18:29:58.735 2834 4082 W System.err: at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:222)
09-26 18:29:58.735 2834 4082 W System.err: at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:131)
09-26 18:29:58.735 2834 4082 W System.err: at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:222)
09-26 18:29:58.735 2834 4082 W System.err: at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:131)
09-26 18:29:58.736 2834 4082 W System.err: at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:222)
09-26 18:29:58.736 2834 4082 W System.err: at com.google.gson.Gson.fromJson(Gson.java:932)
09-26 18:29:58.736 2834 4082 W System.err: at com.google.gson.Gson.fromJson(Gson.java:897)
09-26 18:29:58.736 2834 4082 W System.err: at com.google.gson.Gson.fromJson(Gson.java:846)
09-26 18:29:58.736 2834 4082 W System.err: at com.google.gson.Gson.fromJson(Gson.java:817)
Puede modificar el tipo de datos pasado en json al tipo de datos encapsulado por el bean personalizando el adaptador y anotándolo.
1. Cadena a la lista
public class CityAdapter extends TypeAdapter<List<String>> {
@Override
public void write(JsonWriter out, List<String> value) throws IOException {
}
@Override
public List<String> read(JsonReader in) throws IOException {
List<String> cityList = new ArrayList<>();
JsonToken token = in.peek();
if (token == JsonToken.STRING) {
String value = in.nextString();
cityList.add(value);
} else if (token == JsonToken.BEGIN_ARRAY) {
in.beginArray();
while (in.hasNext()) {
String value = in.nextString();
cityList.add(value);
}
in.endArray();
}
return cityList;
}
}
2. Convertir objeto en cadena
public class BusinessAreaAdapter extends TypeAdapter<List<CityData.BusinessArea>> {
@Override
public void write(JsonWriter out, List<CityData.BusinessArea> value) throws IOException {
}
@Override
public List<CityData.BusinessArea> read(JsonReader in) throws IOException {
List<CityData.BusinessArea> businessAreas = new ArrayList<>();
JsonToken token = in.peek();
if (token == JsonToken.BEGIN_ARRAY) {
in.beginArray();
while (in.hasNext()) {
JsonToken innerToken = in.peek();
if (innerToken == JsonToken.BEGIN_OBJECT) {
CityData.BusinessArea businessArea = readBusinessArea(in);
businessAreas.add(businessArea);
} else if (innerToken == JsonToken.BEGIN_ARRAY) {
in.skipValue();
}
}
in.endArray();
}
return businessAreas;
}
private CityData.BusinessArea readBusinessArea(JsonReader in) throws IOException {
CityData.BusinessArea businessArea = new CityData.BusinessArea();
in.beginObject();
while (in.hasNext()) {
String name = in.nextName();
if (name.equals("name")) {
businessArea.setName(in.nextString());
} else if (name.equals("location")) {
businessArea.setLocation(in.nextString());
} else if (name.equals("id")) {
businessArea.setId(in.nextString());
}
}
in.endObject();
return businessArea;
}
}
Convertir mediante anotaciones en java beans
public class AddressComponent {
private String province;
//哪个属性需要转换,就在哪个属性上加注解
@JsonAdapter(CityAdapter.class)
private List<String> city;
private String district;
// 构造器
// getter && setter
// ...
}
Las siguientes son algunas consideraciones para convertir json a java beans:
① El nombre del atributo en el bean debe ser coherente con el de json. El tipo de bean puede ser inconsistente; de lo contrario, el escape fallará.
② Simplemente escape los atributos requeridos, no es necesario encapsular todos los atributos en json en beans.