How to parse inner json string as nested class using retrofit

t.m. :

I have used retrofit with nested classes before, but the current api I'm tring to use has such a structure:

Request body:

{
   "Id" : "a2",
   "messageCode" : 1,
   "bigNestedClass" : "{\"field1\":238,\"otherField\":246,\"ip\":\"10.255.130.154\",\"someOtherField\":15,\"Info\":1501069568}"
}

and a similar response body.

Note that bigNestedClass is a string.

I created different pojo classes for request and response. However, creating a nested BigNestedClass makes this field filled as JSON object, as expected, not a JSON string. And I have same problem parsing the response too.

My question: Is there a way in retrofit that enables encode, parse nested classes as strings?

I use Retrofit 2.0
I use gson (can be changed)

pirho :

With I would simply make this with TypeAdapter. See the class below:

public class MyTypeAdapter extends TypeAdapter<BigNestedClass> {

    private Gson gson = new Gson();

    @Override
    public BigNestedClass read(JsonReader arg0) throws IOException {
        // Get the string value and do kind of nested deserializing to an instance of
        // BigNestedClass
        return gson.fromJson(arg0.nextString(), BigNestedClass.class);
    }

    @Override
    public void write(JsonWriter arg0, BigNestedClass arg1) throws IOException {
        // Get the instance value and insted of normal serializing make the written
        // value to be a string having escaped json
        arg0.value(gson.toJson(arg1));
    }

}

Then you would only need to register MyTypeAdapter with , like:

private Gson gson = new GsonBuilder()
    .registerTypeAdapter(BigNestedClass.class, new MyTypeAdapter())
    .create();

To have to use it you would need to do just a bit more when creating it:

Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("https://api.example.com")
            .addConverterFactory(GsonConverterFactory.create(gson))
            .build();

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=156207&siteId=1