В моей ситуации у меня есть «модель», состоящая из нескольких параметров 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
туда и обратно JsonObject. Смешивание 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.