Retrofit - 如何定义 hashmap gson 响应?

Retrofit - How do define hashmap gson response?

我已经看过这个 post 并且需要一些说明。

我的结构如下所示:

{
"contacts": [
    {
        "account_id": 3599,
        "created_at": 1427556844,
        "name": "John Smith",
    },
    {
        "account_id": 3599,
        "created_at": 1427155837,
        "name": "Carl Johnson",
    }
  ]
}

我是这样创建的:

public class Contacts {
    @SerializedName("contacts")
    public List<User> contacts;
}

public class User {

    @SerializedName("account_id")
    int accountId;

    @SerializedName("created_at")
    String createdAt;

    @SerializedName("name")
    String name;
}

但是当我尝试 运行 它进行改造时,我得到 "Retrofit Expected BEGIN_OBJECT but was BEGIN_ARRAY"。根据这个 post 我的语法是正确的。但我更喜欢 Jake Wharton 的解决方案(来自另一个 post 提到的),它实际上是一个 hashmap

Map<String, List<User>>

但是将联系人对象更改为使用 Hashmap 会给我以下错误:"Expected BEGIN_ARRAY but was BEGIN_OBJECT"。所以请帮我弄清楚如何使用改造和 robospice 来定义对象。

已编辑:

我正在使用 robospice,所以我有这个:

@Override
public Contacts loadDataFromNetwork() throws Exception {

    final AlertPolicies[] myIncidents = {null};

    return getService().getContacts();
}

并且在 activity 中我在 onStart() 中定义:

spiceManager.execute(contactsRequest, CACHE_KEY, DurationInMillis.ONE_MINUTE, new ContactsRequestListener());

听众是这样的:

private final class ContactsRequestListener implements RequestListener<Contacts> {

    @Override
    public void onRequestFailure(SpiceException spiceException) {
        if(Constant.DEBUG) Log.d(TAG, "onRequestFailure: " + spiceException.getMessage());
        Toast.makeText(ContactsActivity.this, "failure", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onRequestSuccess(Contacts contacts) {
        if(Constant.DEBUG) Log.d(TAG, "onRequestSuccess");
        Toast.makeText(AlertPoliciesActivity.this, "success", Toast.LENGTH_SHORT).show();

        if(contacts != null) {
            updateContacts(contacts);
        }
    }
}

Contacts 始终为 null,如果我查看它显示的响应 "Retrofit Expected BEGIN_OBJECT but was BEGIN_ARRAY" 并按照我上面解释的那样尝试另一种方式,则会给我另一个错误。

HashMap<Integer,User> hash=new HashMap();
@Override
    public void onRequestSuccess(Contacts contacts) {
        if(Constant.DEBUG) Log.d(TAG, "onRequestSuccess");
        Toast.makeText(AlertPoliciesActivity.this, "success", Toast.LENGTH_SHORT).show();

        if(contacts != null) {
            for(int i=0;i<contacts.size();i++){
              hash.put(contacts.contacts.get(i).accountId,contacts.contacts);
            }
        }
    }

谢谢,但我认为根本不必使用回调的诀窍实际上是:

@SerializedName("contacts")
public List<User> contacts;

但我会记住你的哈希图。