Skip to content

[SUGGEST] Please make support for Retrofit library by making this as jackson-jr Retrofit converter #30

@GulajavaMinistudio

Description

@GulajavaMinistudio

I make custom converter factory for Jackson-jr parser.
Jackson-jr itself is good for mobile devices due to resource requirements during startup and usage is quite low.
https://github.com/FasterXML/jackson-jr

And after a long experiment, Converter Factory for Jackson-jr was successfully run.
I use generic class or object T that needed for Jackson-jr for JSON Parsing.

Here's the snippet

public class JacksonJrConverters<T> extends Converter.Factory {

    private static final MediaType MEDIA_TYPE = MediaType.parse("application/json; charset=UTF-8");
    protected static final String PROTOCOL_CHARSET = "utf-8";

    private Class<T> clazz;

    public JacksonJrConverters(Class<T> tClass) {
        super();
        this.clazz = tClass;
    }


    @Override
    public Converter<ResponseBody, ?> fromResponseBody(Type type, Annotation[] annotations) {
        super.fromResponseBody(type, annotations);

        if (clazz.equals(type)) {

            return new Converter<ResponseBody, T>() {
                @Override
                public T convert(ResponseBody value) throws IOException {

                    return JSON.std.beanFrom(clazz, value.bytes());
                }
            };
        }

        return null;
    }

    @Override
    public Converter<?, RequestBody> toRequestBody(Type type, Annotation[] annotations) {
        super.toRequestBody(type, annotations);

        if (clazz.equals(type)) {
            return new Converter<T, RequestBody>() {
                @Override
                public RequestBody convert(T value) throws IOException {

                    String strs = JSON.std.asString(value);

                    return RequestBody.create(MEDIA_TYPE, strs.getBytes(PROTOCOL_CHARSET));
                }
            };
        }
        return null;
    }
}

Or you can look it in here :
https://gist.github.com/GulajavaMinistudio/67959246f6d94e373d4c

And for Rest Client instance :

public class RestClientsJackson<T> {

    //use class T as generic for Jackson Jr parsing reference
    private Class<T> mClass;
    private OkHttpClient mOkHttpClient;
    public static final String ALAMAT_SERVERS = "https://api.github.com";


    public RestClientsJackson(Class<T> aClass) {
        mClass = aClass;

        mOkHttpClient = new OkHttpClient();
        mOkHttpClient.setConnectTimeout(10, TimeUnit.SECONDS);
        mOkHttpClient.setWriteTimeout(15, TimeUnit.SECONDS);
        mOkHttpClient.setReadTimeout(20, TimeUnit.SECONDS);
    }

    //with jackson jr converter
    public Apis getApiServicesJackson() {

        Log.w("API NULL", "API NULL, INIT LAGI");

        Retrofit.Builder retrobuilder = new Retrofit.Builder();
        retrobuilder.baseUrl(ALAMAT_SERVERS);
        retrobuilder.client(mOkHttpClient);

        retrobuilder.addConverterFactory(new JacksonJrConverters<>(mClass));

        Retrofit retrofits = retrobuilder.build();

        return retrofits.create(Apis.class);
    }
}

Or you can see it here
https://gist.github.com/GulajavaMinistudio/b853e01ee2ef4fb2213a

If you want to testing, i have made sample project for how to usage it :
https://github.com/GulajavaMinistudio/BelajarRetrofitJacksonJr

Hope it can help for someone that need Jackson-jr converter in Retrofit 2.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions