Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Retrofit: Unable to create @Body converter for class

I need to send next json via retrofit 2:

{
    "Inspection": {
        "UUID": "name",
        "ModifiedTime": "2016-03-09T01:13",
        "CreatedTime": "2016-03-09T01:13",
        "ReviewedWith": "name2",
        "Type": 1,
        "Project": {
            "Id": 41
        },
        "ActionTypes": [1]
    }   
}

With Header: Authorization: access_token_value

I tried this:

//header parameter
String accessToken = Requests.getAccessToken();

JsonObject obj = new JsonObject();
JsonObject inspection = new JsonObject();

inspection.addProperty("UUID","name");
inspection.addProperty("ModifiedTime","2016-03-09T01:13");
inspection.addProperty("CreatedTime","2016-03-09T01:13");
inspection.addProperty("ReviewedWith","name2");
inspection.addProperty("Type","1");

JsonObject project = new JsonObject();
project.addProperty("Id", 41);

inspection.add("Project", project);
obj.add("Inspection", inspection);

Retrofit restAdapter = new Retrofit.Builder()
        .baseUrl(Constants.ROOT_API_URL)
        .addConverterFactory(GsonConverterFactory.create())
        .addConverterFactory(ScalarsConverterFactory.create())
        .build();
IConstructSecureAPI service = restAdapter.create(IConstructSecureAPI.class);
Call<JsonElement> result = service.addInspection(accessToken, obj);
JsonElement element = result.execute().body();

But everytime i recieved exception: java.lang.IllegalArgumentException: Unable to create @Body converter for class com.google.gson.JsonObject (parameter #2)

How can I send it ? Or any another idea how I can do it. You can even offer me with parameter as simple String with json inside. It will suit for me

like image 993
kkost Avatar asked Mar 09 '16 00:03

kkost


3 Answers

Solution: declare body value in your interface with next:

@Body RequestBody body and wrap String JSON object:

RequestBody body = RequestBody.create(MediaType.parse("application/json"), obj.toString());

like image 191
kkost Avatar answered Nov 05 '22 07:11

kkost


there is chance of you kept same @SerializedName("") for multiple vairable/fields/tags

like image 21
Mohd Qasim Avatar answered Nov 05 '22 09:11

Mohd Qasim


You can specify a Converter when you create the Retrofit like this

Retrofit retrofit = new Retrofit.Builder()
        .addConverterFactory(GsonConverterFactory.create())
        .baseUrl(baseurl)
        .client(okHttpClient)
        .build();
like image 17
Emanuel Avatar answered Nov 05 '22 07:11

Emanuel