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 Adapter
conversion de mon BaseModel
aller et retour dans un JsonObject. Avoir mélangé String
et byte[]
dans un modèle complique les choses. Apparemment, Gson
je n'aime pas vraiment la situation.
Je finis par faire un Adapter
pour m'assurer qu'il byte[]
est converti au Base64
format. Voici ma Adapter
classe:
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) à Adapter
chaque fois qu'elle est rencontrée lors de la conversion vers / depuis JSONObject.