1. ホーム
  2. java

[解決済み] レトロフィット BEGIN_OBJECTと思ったらBEGIN_ARRAYだった。

2023-06-10 21:32:25

質問

私はJSONのパースにかなり慣れていて、SquareのRetrofitライブラリを使っているのですが、この問題にぶつかりました。

私はこのJSONの応答をパースしようとしています。

[
      {
        "id": 3,
        "username": "jezer",
        "regid": "oiqwueoiwqueoiwqueoiwq",
        "url": "http:\/\/192.168.63.175:3000\/users\/3.json"
      },
      {
        "id": 4,
        "username": "emulator",
        "regid": "qwoiuewqoiueoiwqueoq",
        "url": "http:\/\/192.168.63.175:3000\/users\/4.json"
      },
      {
        "id": 7,
        "username": "test",
        "regid": "ksadqowueqiaksj",
        "url": "http:\/\/192.168.63.175:3000\/users\/7.json"
      }
]

以下は私のモデルです。

public class Contacts {

    public List<User> contacts;

}

...

public class User {

    String username;
    String regid;

    @Override
    public String toString(){
        return(username);
    }  

}

私のインターフェイス

public interface ContactsInterface {

    @GET("/users.json")
    void contacts(Callback<Contacts> cb);

}

my successメソッドです。

@Override
public void success(Contacts c, Response r) {
    List<String> names = new ArrayList<String>();
    for (int i = 0; i < c.contacts.size(); i++) {
        String name = c.contacts.get(i).toString();
        Log.d("Names", "" + name);
        names.add(name);
    }
    ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_spinner_item, names);
    mSentTo.setAdapter(spinnerAdapter);
}

成功メソッドで使用すると、エラーが発生します。

1行目 column2 で BEGIN_OBJECT を期待したが、BEGIN_ARRAY だった。

何が間違っているのでしょうか?

どのように解決するのですか?

今現在、あなたはレスポンスがこのようにフォーマットされているように解析しています。

{
  "contacts": [
    { .. }
  ]
}

例外は、ルートでオブジェクトを期待しているのに、実際のデータは配列であるという点で、これを教えてくれます。これは、型を配列に変更する必要があることを意味します。

最も簡単な方法は、コールバックの直接の型としてリストを使用することです。

@GET("/users.json")
void contacts(Callback<List<User>> cb);