私の状況では、1つを除いていくつかの文字列パラメーターで構成される「モデル」があります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を検索して、JsonObject 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
、JSONObjectへの変換/ JSONObjectへの変換中に遭遇byte[]
するAdapter
たびに、意図した(この場合はクラス)をプッシュすることです。