मेरी स्थिति में, मेरे पास एक "मॉडल" है, जिसमें एक के अपवाद के साथ कई स्ट्रिंग पैरामीटर शामिल हैं: यह बाइट सरणी है 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
शुरू हो रहा है। एसओ के माध्यम से खोज करते हुए, मुझे एहसास हुआ कि मुझे 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
जब भी इसे / fro JSONObject के रूपांतरण के दौरान सामना किया जाता है।