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"
}