リクエストのパラメータの1つでカスタムJSONオブジェクトでHTTP PUTリクエストを送信する必要があります。ここに問題があります:Retrofit2で使用すると、シリアライザが呼び出されません。Retrofit2:@フィールドアノテートされたパラメータに対してシリアライザが呼び出されない
私のオブジェクトは、このようになります必要があります:私はそれを直接呼び出すと
{
"ignore":["item1", "item2"]
}
それがうまく機能:
final Gson gson = new GsonBuilder()
.registerTypeAdapter(MyModel.class, new MyModelSerializer())
.create();
String s = gson.toJson(new MyModel(MyModel.ActionName.ACCEPT, new ArrayList<String>()));
Log.d("tag", s);
私は{"accept":[]}
を取得します。
try {
MyModel myModel = new MyModel(MyModel.ActionName.ACCEPT, new ArrayList<String>());
Response<ResultModel> response = getMyApi().getResult(1, "abc", myModel).execute();
if (response.isSuccessful()) {
ResultModel resultModel = response.body();
// handle resultModel
}
} catch (Exception e) {
e.printStackTrace();
}
MyApi:
@FormUrlEncoded
@PUT("path/{id}")
Call<ResultModel> getResult(@Path("id") long item, @Field("name") @NonNull String name, @Field("items") @NonNull MyModel myModel);
getMyApi()メソッドD/OkHttp: name=abc&items=ru.bartwell.myapp.MyModel%4010a3d8b
が、私はこのコードを使用して要求を行います。私は改修でそれを呼び出すときしかし、私は、このログに参照してください。
public static MyApi getMyApi() {
final Gson gson = new GsonBuilder()
.registerTypeAdapter(MyModel.class, new MyModelSerializer())
.create();
return new Retrofit.Builder()
.baseUrl(BuildConfig.END_POINT_MY_API)
.client(MyOkHttpClient.create())
.addConverterFactory(GsonConverterFactory.create(gson))
.build()
.create(MyApi.class);
}
モデル:
public class MyModel {
@NonNull
private ActionName mActionName;
@NonNull
private List<String> mItems = new ArrayList<>();
public MyModel(@NonNull final ActionName actionName, @NonNull final List<String> items) {
mActionName = actionName;
mItems = items;
}
@NonNull
public ActionName getActionName() {
return mActionName;
}
@NonNull
public List<String> getItems() {
return mItems;
}
public enum ActionName {
ACCEPT("accept"), DECLINE("decline"), IGNORE("ignore");
private String mName;
ActionName(@NonNull final String name) {
mName = name;
}
public String getName() {
return mName;
}
}
}
シリアライザ:
public class MyModelSerializer implements JsonSerializer<MyModel> {
@Override
public JsonElement serialize(@NonNull MyModel src, @NonNull Type typeOfSrc, @NonNull JsonSerializationContext context) {
JsonObject obj = new JsonObject();
obj.add(src.getActionName().getName(), new Gson().toJsonTree(src.getItems()));
return obj;
}
}
はどのようにそれを修正するには?