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