改造 - 如何定义hashmap gson响应?

时间:2015-04-09 08:23:32

标签: android hashmap gson retrofit

我看过这个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但是BEGIN_ARRAY”。根据这篇文章我的语法是正确的。但我更多的是Jake Whartons解决方案(来自其他帖子),这里它实际上是一个hashmap

Map<String, List<User>>

但是更改联系人对象以使用Hashmap会给我以下错误:“预期BEGIN_ARRAY但是BEGIN_OBJECT”。所以请帮我弄清楚如何使用改造和robospice来定义对象。

编辑:

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

@Override
public Contacts loadDataFromNetwork() throws Exception {

    final AlertPolicies[] myIncidents = {null};

    return getService().getContacts();
}

在我在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);
        }
    }
}

联系人始终为空,如果我查看响应,它会显示“Retrofit Expected BEGIN_OBJECT但是BEGIN_ARRAY”并尝试另一种方式,正如我上面解释的那样给了我另一个错误。

2 个答案:

答案 0 :(得分:0)

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);
            }
        }
    }

答案 1 :(得分:0)

谢谢,但我觉得这个诀窍,根本就没有使用回调,实际上是:

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

但我会记住你的hashmap。