In meiner Situation habe ich ein "Modell", das aus mehreren String-Parametern besteht, mit einer Ausnahme: Es ist ein Byte-Array byte[]
. Einige Codefragmente:
String response = args[0].toString();
Gson gson = new Gson();
BaseModel responseModel = gson.fromJson(response, BaseModel.class);
Die letzte Zeile oben ist, wenn die
java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column
wird ausgelöst. Beim Durchsuchen des SO wurde mir klar, dass ich eine Form haben muss Adapter
, um mein BaseModel
JsonObject hin und her zu konvertieren. Das Mischen von String
und byte[]
in einem Modell macht die Sache komplizierter. Anscheinend Gson
mag die Situation nicht wirklich.
Am Ende mache ich ein, Adapter
um sicherzustellen, dass byte[]
es in das Base64
Format konvertiert wird . Hier ist meine Adapter
Klasse:
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));
}
}
Um JSONObject in ein Modell zu konvertieren, habe ich Folgendes verwendet:
Gson customGson = new GsonBuilder().registerTypeHierarchyAdapter(byte[].class, new ByteArrayToBase64Adapter()).create();
BaseModel responseModel = customGson.fromJson(response, BaseModel.class);
Um das Modell in JSONObject zu konvertieren, habe ich Folgendes verwendet:
Gson customGson = new GsonBuilder().registerTypeHierarchyAdapter(byte[].class, new ByteArrayToBase64Adapter()).create();
String responseJSon = customGson.toJson(response);
Was der Code tut, ist im Grunde, die beabsichtigte class/object
(in diesem Fall byte[]
Klasse) durch die zu schieben , Adapter
wann immer sie während der Konvertierung zu / von JSONObject angetroffen wird.