Nella mia situazione, ho un "modello", composto da diversi parametri String, ad eccezione di uno: è un array di byte byte[]
. Alcuni frammenti di codice:
String response = args[0].toString();
Gson gson = new Gson();
BaseModel responseModel = gson.fromJson(response, BaseModel.class);
L'ultima riga sopra è quando il file
java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column
E 'attivato. Cercando attraverso il SO, mi sono reso conto che ho bisogno di una qualche forma Adapter
per convertire il mio BaseModel
avanti e indietro un JsonObject. Avere mescolato String
e byte[]
in un modello complica le cose. A quanto pare, Gson
non mi piace molto la situazione.
Finisco per fare un Adapter
per assicurarmi che byte[]
venga convertito in Base64
formato. Ecco la mia 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));
}
}
Per convertire JSONObject in modello, ho usato quanto segue:
Gson customGson = new GsonBuilder().registerTypeHierarchyAdapter(byte[].class, new ByteArrayToBase64Adapter()).create();
BaseModel responseModel = customGson.fromJson(response, BaseModel.class);
Allo stesso modo, per convertire il modello in JSONObject, ho utilizzato quanto segue:
Gson customGson = new GsonBuilder().registerTypeHierarchyAdapter(byte[].class, new ByteArrayToBase64Adapter()).create();
String responseJSon = customGson.toJson(response);
Ciò che il codice sta facendo è fondamentalmente spingere il previsto class/object
(in questo caso, la byte[]
classe) attraverso Adapter
ogni volta che viene incontrato durante la conversione da / a JSONObject.