У моїй ситуації у мене є "модель", що складається з декількох параметрів String, за винятком одного: це байтовий масив byte[]
. Деякі фрагменти коду:
String response = args[0].toString();
Gson gson = new Gson();
BaseModel responseModel = gson.fromJson(response, BaseModel.class);
Останній рядок вище, коли
java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column
спрацьовує. Шукаючи через SO, я зрозумів, що мені потрібно мати певну форму, Adapter
щоб перетворити мій BaseModel
JOSObject і назад. Змішання String
та byte[]
моделювання робить все складніше. Мабуть, Gson
ситуація не дуже подобається.
У кінцевому підсумку роблю Adapter
переконайтеся byte[]
, що перетворюється у Base64
формат. Ось мій Adapter
клас:
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));
}
}
Для перетворення JSONObject в модель я використав наступне:
Gson customGson = new GsonBuilder().registerTypeHierarchyAdapter(byte[].class, new ByteArrayToBase64Adapter()).create();
BaseModel responseModel = customGson.fromJson(response, BaseModel.class);
Так само для перетворення моделі в JSONObject я використав наступне:
Gson customGson = new GsonBuilder().registerTypeHierarchyAdapter(byte[].class, new ByteArrayToBase64Adapter()).create();
String responseJSon = customGson.toJson(response);
Що робить код, це в основному для проштовхування призначеного class/object
(у даному випадку byte[]
класу) за допомогою Adapter
кожного разу, коли він стикається під час перетворення в / назад JSONObject.