Dans ma situation, j'ai un "modèle", composé de plusieurs paramètres String, à l'exception d'un: c'est un tableau d'octets byte[]. Un extrait de code:
String response = args[0].toString();
Gson gson = new Gson();
BaseModel responseModel = gson.fromJson(response, BaseModel.class);
La dernière ligne ci-dessus est quand le
java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column
est déclenché. En cherchant dans le SO, j'ai réalisé que je devais avoir une forme de Adapterconversion de mon BaseModelaller et retour dans un JsonObject. Avoir mélangé Stringet byte[]dans un modèle complique les choses. Apparemment, Gsonje n'aime pas vraiment la situation.
Je finis par faire un Adapterpour m'assurer qu'il byte[]est converti au Base64format. Voici ma Adapterclasse:
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));
}
}
Pour convertir JSONObject en modèle, j'ai utilisé ce qui suit:
Gson customGson = new GsonBuilder().registerTypeHierarchyAdapter(byte[].class, new ByteArrayToBase64Adapter()).create();
BaseModel responseModel = customGson.fromJson(response, BaseModel.class);
De même, pour convertir le modèle en JSONObject, j'ai utilisé ce qui suit:
Gson customGson = new GsonBuilder().registerTypeHierarchyAdapter(byte[].class, new ByteArrayToBase64Adapter()).create();
String responseJSon = customGson.toJson(response);
Ce que fait le code est essentiellement de pousser la classe voulue class/object(dans ce cas, la byte[]classe) à Adapterchaque fois qu'elle est rencontrée lors de la conversion vers / depuis JSONObject.