Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Serialização Json

Bom dia!

no curso é explicado como é feito a recuperação de um retorno Json do Server e feito a serialização com a classe AlunosSync no pacote DTO!

Eu quero fazer a mesma coisa, e mostrar em uma ListView!

Acontece que estou recebendo o seguinte erro:

Can not deserialize instance of br.com.paises.dto.PaisSync out of START_ARRAY token at [Source: okhttp3.ResponseBody$BomAwareReader@b823296; line: 1, column: 1]

segue também o link do Json : http://sslapidev.mypush.com.br/world/countries/active

Se alguém puder ajuda, fico muito Agradecido!

4 respostas

Bom dia Iran, blz?

Nesse conjunto de informações que passou basta apenas pedir uma List da seguinte classe:

public class Country {

    private long id;
    private String iso;
    private String shortname;
    private String longname;
    private String callingCode;
    private int status;
    private String culture;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getIso() {
        return iso;
    }

    public void setIso(String iso) {
        this.iso = iso;
    }

    public String getShortname() {
        return shortname;
    }

    public void setShortname(String shortname) {
        this.shortname = shortname;
    }

    public String getLongname() {
        return longname;
    }

    public void setLongname(String longname) {
        this.longname = longname;
    }

    public String getCallingCode() {
        return callingCode;
    }

    public void setCallingCode(String callingCode) {
        this.callingCode = callingCode;
    }

    public int getStatus() {
        return status;
    }

    public void setStatus(int status) {
        this.status = status;
    }

    public String getCulture() {
        return culture;
    }

    public void setCulture(String culture) {
        this.culture = culture;
    }

    @Override
    public String toString() {
        return id + " " + shortname;
    }
}

Pois os dados que você pediu é justamente uma lista que contém objetos que podem ser representados pela classe acima. Deixei um toString() justamente porque eu acabei de testar, logo, você pode deixá-lo para verificar se deu certo também.

[]s

Obrigado pelo Retorno Alex!

Intendi! E como faço pra mostrar essa Lista retornada em uma List View, sem persistir no Banco de Dados? seria algo assim, certo?

public class ListaCoutriesActivity extends AppCompatActivity {

    private ListView listaCoutries;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_lista_coutries);

        this.listaCoutries = (ListView) findViewById(R.id.lista_coutries);
    }

    @Override
    protected void onResume() {
        super.onResume();

        Call<List<Coutry>> call = new RetrofitInicializador().getCoutryService().lista();

        //thread Assincrona
        call.enqueue(new Callback<List<Coutry>>() {
            @Override
            public void onResponse(Call<List<Coutry>> call, Response<List<Coutry>> response) {

                List<Coutry> paises = response.body();
            }

            @Override
            public void onFailure(Call<List<Coutry>> call, Throwable t) {

                Log.e("Falha", t.getMessage());
            }
        });
    }
}

Como retorno essa lista no meu "onResponse?

Obrigado

solução!

Oi Iran,

A primeira abordagem que você pode usar é fazer com que o adapter seja settado dentro do onResponse assim que você está conseguindo a lista de countries. Por exemplo:

@Override
            public void onResponse(Call<List<Coutry>> call, Response<List<Coutry>> response) {

                List<Coutry> paises = response.body();

        listaCoutries.setAdapter(new MeuAdapter(paises));
            }

Então você realiza a implementação que foi vista nos primeiros cursos de Android.

Embora a alternativa que mostrei em cima funcione, observe que dessa forma você tá sempre instanciando um novo adapter para cada requisição, sendo que na verdade não é o adapter que mudou e sim os dados dele!

Isso significa que se você fizer uma nova requisição e quiser apenas adicionar novos paises, o ideal é que você avise o adapter por meio do método notifyDataSetChanged(). Eu não tenho um tutorial pronto sobre como você poderia fazer, porém, neste link tem um tópico no qual alguns desenvolvedores mostraram como pode ser feito evitando essa nova instância desnecessária no adapter para cada request.

Alex, Valeu demais!

Muito Obrigado