W mojej sytuacji mam „model”, składający się z kilku parametrów String, z wyjątkiem jednego: jest to tablica bajtów byte[]
. Jakiś fragment kodu:
String response = args[0].toString();
Gson gson = new Gson();
BaseModel responseModel = gson.fromJson(response, BaseModel.class);
Ostatnia linia powyżej dotyczy pliku
java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column
jest wyzwalany. Przeszukując SO, zdałem sobie sprawę, że potrzebuję jakiejś formy Adapter
konwersji BaseModel
do i z JsonObject. Mieszanie String
i byte[]
w modelu komplikuje sprawę. Widocznie,Gson
nie podoba mi się ta sytuacja.
W końcu robię, Adapter
aby upewnić się, że byte[]
zostanie przekonwertowany do Base64
formatu. Oto moja Adapter
klasa:
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));
}
}
Aby przekonwertować JSONObject na model, użyłem:
Gson customGson = new GsonBuilder().registerTypeHierarchyAdapter(byte[].class, new ByteArrayToBase64Adapter()).create();
BaseModel responseModel = customGson.fromJson(response, BaseModel.class);
Podobnie, aby przekonwertować model na JSONObject, użyłem:
Gson customGson = new GsonBuilder().registerTypeHierarchyAdapter(byte[].class, new ByteArrayToBase64Adapter()).create();
String responseJSon = customGson.toJson(response);
Zasadniczo kod polega na przepchnięciu zamierzonej class/object
(w tym przypadku byte[]
klasy) przez plikAdapter
każdym razem, gdy zostanie napotkana podczas konwersji do / z JSONObject.