mpao
9/17/2017 - 9:50 PM

Retrofit e Gson ( Kotlin )

Retrofit e Gson ( Kotlin )

class Activity : AppCompatActivity() {

    lateinit var retrofit: MyRetrofit

    override fun onCreate(savedInstanceState: Bundle?) {

        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        /**
         * Prendo l'intero response come testo
         */
        retrofit = Retrofit.Builder()
                .baseUrl("http://opendata.comune.fi.it/")
                .build()
                .create(MyRetrofit::class.java);
        retrofit.get().enqueue(object: Callback<ResponseBody>{
            override fun onResponse(call: Call<ResponseBody>, response: Response<ResponseBody>){

                val s = response.body()?.string()
                Log.i("test", s)

            }

            override fun onFailure(call: Call<ResponseBody>, t: Throwable) {
                t.printStackTrace()
            }
        })

        /**
         * Prendo il response come JsonArray. Con Gson inoltre, si può effettuare il parsing dell'output
         * in maniera automatica ed avere già gli oggetti a disposizione. Tutto però dipende dalla struttura
         * del json messo a disposizione dalla API, quindi per chiarimenti, guarda la fonte dati di questo esempio
         */
        val gson = GsonBuilder().registerTypeAdapter(Array<Item>::class.java, MyDeserializer()).create();

        retrofit = Retrofit.Builder()
                .baseUrl("http://opendata.comune.fi.it/")
                .addConverterFactory(GsonConverterFactory.create( gson ))
                .build()
                .create(MyRetrofit::class.java);

        retrofit.array().enqueue(object : Callback<Array<Item>>{

            override fun onResponse(call: Call<Array<Item>>, response: Response<Array<Item>>) {

                val array = response.body()
                val max = array?.size
                Log.i("test", max.toString())

            }

            override fun onFailure(call: Call<Array<Item>>?, t: Throwable) {
                t.printStackTrace()
            }

        })
    }

}
data class Item (

    @SerializedName("image2")
    @Expose
    var image2: Any? = null,
    @SerializedName("Autoreply_(Italian)")
    @Expose
    var autoreplyItalian: String? = null,
    @SerializedName("SMB_resources")
    @Expose
    var sMBResources: Any? = null,
    @SerializedName("link")
    @Expose
    var link: Any? = null,
    @SerializedName("Image1")
    @Expose
    var image1: String? = null,
    @SerializedName("Tweet_copy_(Italian)")
    @Expose
    var tweetCopyItalian: String? = null,
    @SerializedName("Autoreply_(English)")
    @Expose
    var autoreplyEnglish: String? = null,
    @SerializedName("image4")
    @Expose
    var image4: Any? = null,
    @SerializedName("image3")
    @Expose
    var image3: Any? = null,
    @SerializedName("Tweet_copy_(English)")
    @Expose
    var tweetCopyEnglish: String? = null

)
class MyDeserializer: JsonDeserializer<Array<Item>> {

    @Throws(JsonParseException::class)
    override fun deserialize(je: JsonElement, type: Type, jdc: JsonDeserializationContext): Array<Item> {

        val data = je.asJsonObject.getAsJsonArray("data")
        return Gson().fromJson(data, type)

    }

}
interface MyRetrofit {

    @GET("materiali/cultura_turismo/secretflorence.json")
    fun get(): Call<ResponseBody>

    @GET("materiali/cultura_turismo/secretflorence.json")
    fun array(): Call<Array<Item>>

}
...
...
android {
    compileSdkVersion 26
    ...
}
ext.retrofit    = "2.3.0"

dependencies {
  ...
    //retrofit
    compile "com.squareup.retrofit2:converter-gson:$retrofit"
    compile "com.squareup.retrofit2:retrofit:$retrofit"
}