Utilice anotaciones para resolver inconsistencias en el tipo de datos json

  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.

Supongo que te gusta

Origin blog.csdn.net/m0_50408097/article/details/133384682
Recomendado
Clasificación