Benim durumumda, birkaç String parametresinden oluşan bir "model" var, bunlardan biri hariç: bayt dizisi byte[]
. Bazı kod parçacığı:
String response = args[0].toString();
Gson gson = new Gson();
BaseModel responseModel = gson.fromJson(response, BaseModel.class);
Yukarıdaki son satır,
java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column
tetiklendi. SO'da arama yaparken, kendimi bir JsonObject'e ve JsonObject'e Adapter
dönüştürmek için bir şekilde ihtiyacım olduğunu fark ettim BaseModel
. Bir modelin içinde String
ve byte[]
içinde karışık olması işleri karmaşıklaştırır. Görünüşe göre, Gson
durumu pek sevmiyorsun.
Adapter
Formata byte[]
dönüştürülmesini sağlamak için bir hazırladım Base64
. İşte Adapter
sınıfım:
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'i modele dönüştürmek için aşağıdakileri kullandım:
Gson customGson = new GsonBuilder().registerTypeHierarchyAdapter(byte[].class, new ByteArrayToBase64Adapter()).create();
BaseModel responseModel = customGson.fromJson(response, BaseModel.class);
Benzer şekilde, modeli JSONObject'e dönüştürmek için aşağıdakileri kullandım:
Gson customGson = new GsonBuilder().registerTypeHierarchyAdapter(byte[].class, new ByteArrayToBase64Adapter()).create();
String responseJSon = customGson.toJson(response);
Kodun yaptığı şey, temelde JSONObject'e / fro dönüştürme sırasında karşılaşıldığında amaçlanan class/object
(bu durumda, byte[]
sınıfı) Adapter
itmektir.