En mi situación, tengo un "modelo", que consta de varios parámetros de cadena, con la excepción de uno: es una matriz de bytes byte[]
. Algún fragmento de código:
String response = args[0].toString();
Gson gson = new Gson();
BaseModel responseModel = gson.fromJson(response, BaseModel.class);
La última línea de arriba es cuando el
java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column
se activa. Buscando a través del SO, me di cuenta de que necesito tener alguna forma de Adapter
convertir mi BaseModel
de un lado a otro en un JsonObject. Haber mezclado String
y byte[]
en un modelo complica la cosa. Aparentemente, Gson
no me gusta mucho la situación.
Termino haciendo un Adapter
para asegurar que byte[]
se convierta a Base64
formato. Aquí está mi Adapter
clase:
public class ByteArrayToBase64Adapter implements JsonSerializer<byte[]>, JsonDeserializer<byte[]> {
@Override
public byte[] deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
return Base64.decode(json.getAsString(), Base64.NO_WRAP);
}
@Override
public JsonElement serialize(byte[] src, Type typeOfSrc, JsonSerializationContext context) {
return new JsonPrimitive(Base64.encodeToString(src, Base64.NO_WRAP));
}
}
Para convertir JSONObject en modelo, utilicé lo siguiente:
Gson customGson = new GsonBuilder().registerTypeHierarchyAdapter(byte[].class, new ByteArrayToBase64Adapter()).create();
BaseModel responseModel = customGson.fromJson(response, BaseModel.class);
De manera similar, para convertir el modelo a JSONObject, utilicé lo siguiente:
Gson customGson = new GsonBuilder().registerTypeHierarchyAdapter(byte[].class, new ByteArrayToBase64Adapter()).create();
String responseJSon = customGson.toJson(response);
Lo que está haciendo el código es básicamente empujar lo deseado class/object
(en este caso, la byte[]
clase) a través del Adapter
siempre que se encuentre durante la conversión a / fro JSONObject.