Trong tình huống của tôi, tôi có một "mô hình", bao gồm một số tham số Chuỗi, ngoại trừ một tham số: đó là mảng byte byte[]
. Một số đoạn mã:
String response = args[0].toString();
Gson gson = new Gson();
BaseModel responseModel = gson.fromJson(response, BaseModel.class);
Dòng cuối cùng ở trên là khi
java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column
được kích hoạt. Tìm kiếm qua SO, tôi nhận ra rằng tôi cần phải có một số hình thức Adapter
để chuyển đổi BaseModel
sang và chuyển đổi một JsonObject. Việc kết hợp giữa String
và byte[]
trong một mô hình sẽ làm mọi thứ phức tạp. Rõ ràng, Gson
không thực sự thích tình hình.
Tôi kết thúc việc thực hiện một Adapter
để đảm bảo byte[]
được chuyển đổi sang Base64
định dạng. Đây là Adapter
lớp học của tôi :
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));
}
}
Để chuyển đổi JSONObject thành mô hình, tôi đã sử dụng như sau:
Gson customGson = new GsonBuilder().registerTypeHierarchyAdapter(byte[].class, new ByteArrayToBase64Adapter()).create();
BaseModel responseModel = customGson.fromJson(response, BaseModel.class);
Tương tự, để chuyển đổi mô hình thành JSONObject, tôi đã sử dụng như sau:
Gson customGson = new GsonBuilder().registerTypeHierarchyAdapter(byte[].class, new ByteArrayToBase64Adapter()).create();
String responseJSon = customGson.toJson(response);
Những gì mã đang làm về cơ bản là để đẩy dự định class/object
(trong trường hợp này là byte[]
lớp) thông qua Adapter
bất cứ khi nào nó gặp phải trong quá trình chuyển đổi sang / fro JSONObject.