ในสถานการณ์ของฉันฉันมี "รูปแบบ" ประกอบด้วยพารามิเตอร์สตริงหลายยกเว้นหนึ่ง: 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 เป็น model ฉันใช้สิ่งต่อไปนี้:
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