Dalam situasi saya, saya memiliki "model", terdiri dari beberapa parameter String, dengan pengecualian satu: itu adalah array byte byte[]
. Beberapa cuplikan kode:
String response = args[0].toString();
Gson gson = new Gson();
BaseModel responseModel = gson.fromJson(response, BaseModel.class);
Baris terakhir di atas adalah saat
java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column
dipicu. Mencari melalui SO, saya menyadari bahwa saya perlu memiliki beberapa bentuk Adapter
untuk mengubah saya BaseModel
ke sana kemari menjadi JsonObject. Memiliki campuran String
dan byte[]
dalam model memang memperumit. Rupanya, Gson
tidak terlalu suka situasinya.
Saya akhirnya membuat Adapter
untuk memastikan byte[]
diubah ke Base64
format. Ini Adapter
kelas saya :
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));
}
}
Untuk mengonversi JSONObject menjadi model, saya menggunakan yang berikut ini:
Gson customGson = new GsonBuilder().registerTypeHierarchyAdapter(byte[].class, new ByteArrayToBase64Adapter()).create();
BaseModel responseModel = customGson.fromJson(response, BaseModel.class);
Demikian pula, untuk mengonversi model ke JSONObject, saya menggunakan yang berikut ini:
Gson customGson = new GsonBuilder().registerTypeHierarchyAdapter(byte[].class, new ByteArrayToBase64Adapter()).create();
String responseJSon = customGson.toJson(response);
Apa yang kode lakukan pada dasarnya adalah untuk mendorong yang dimaksudkan class/object
(dalam hal ini, byte[]
kelas) melalui Adapter
setiap kali ditemui selama konversi ke / dari JSONObject.