您好我正在尝试学习Android并且目前正在实施改造,并尝试使用相关帖子解决这个问题,遗憾的是没有帮助我请听我说。
我有一个json数据,我需要在这里解析它是
{
"-KNea90tV5nZlkeqxc3Q": {
"accountName": "Mark Angelo Noquera",
"accountNumber": "12435656443",
"accountType": "Peso Savings"
},
"-KNeaPmBoTXV4mQC6cia": {
"accountName": "Mark Angelo Noquera",
"accountNumber": "12435656444",
"accountType": "Peso Checking"
},
"-KNeaWe_ZbtI9Tn6l-oF": {
"accountName": "Mark Angelo Noquera",
"accountNumber": "12435656445",
"accountType": "Personal Loan"
}}
然后一些教程告诉我使用hashmap所以我实现了我的 这是我的ModelClass1.class
public class MarkSamples {
public HashMap<String, MarkSample> marksamples;
public HashMap<String, MarkSample> getMarksamples() {
return marksamples;
}}
ModeClass2.class - 用于处理对象
public class MarkSample {
@SerializedName("accountName")
public String acntName;
@SerializedName("accountNumber")
public String acntNumber;
@SerializedName("accountType")
public String acntType;
public String getName() {
return (acntName);
}
public void setName(String acntName) {
this.acntName = acntName;
}
public String getNumber() {
return (acntNumber);
}
public void setNumber(String acntNumber) {
this.acntNumber = acntNumber;
}
public String getType() {
return (acntType);
}
public void setType(String acntType) {
this.acntType = acntType;
}
}
我的API在这里更新
public interface ContactsAPI {
@GET("/api/accounts.json")
public void getSamples(Callback<HashMap<String, MarkSample>> response);}
最后我在这里打电话给我的经纪人更新
api.getSamples(new Callback<HashMap<String, MarkSample>>() {
@Override
public void success(HashMap<String, MarkSample> stringMarkSampleHashMap, Response response) {
loading.dismiss();
int mint = stringMarkSampleHashMap.size();
Toast.makeText(mainActivity, mint, Toast.LENGTH_SHORT).show();
}
@Override
public void failure(RetrofitError error) {
}
});
每次我举起结果我得到一个空值我没有实现它错了吗?我确定我正确使用了我的RootUrl如果这不是问题我可以使用的其他方法是什么?请帮帮我。
这是我的Logcat 更新
FATAL EXCEPTION: main
Process: com.exist.kelvs.retrofit2, PID: 2517
android.content.res.Resources$NotFoundException: String resource ID #0x3
at android.content.res.Resources.getText(Resources.java:312)
at android.widget.Toast.makeText(Toast.java:286)
at com.exist.kelvs.retrofit2.RetrofitHandler$2.success(RetrofitHandler.java:51)
at com.exist.kelvs.retrofit2.RetrofitHandler$2.success(RetrofitHandler.java:46)
at retrofit.CallbackRunnable$1.run(CallbackRunnable.java:45)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
答案 0 :(得分:2)
将api定义更新为:
@GET("/api/accounts.json")
public void getSamples(Map<String,MarkSample> response);}
api致电:
api.getSamples(new Callback<Map<String,MarkSample>() {
@Override
public void success(Map<String,MarkSample> samplelist, Response response) {
loading.dismiss();
int mint = samplelist.size();
...
<强>更新
要获取所有帐户名,请将此代码添加到回调中:
...
loading.dismiss();
int mint = 0;
if (samplelist!=null){
mint = samplelist.size();
for (MarkSample item:samplelist.values()){
Log.d("TEST","value: "+item.getName();
}
}
...
答案 1 :(得分:0)
查看这篇文章: Getting Starter with Retrofit 2
使用设置转换器工厂的Retrofit2调用来排队数据
您的问题是序列化:
响应中没有marksamples
字段。您不需要特殊的MarkSamples类。看看如何修改代码:
public interface ContactsAPI {
@GET("/api/accounts.json")
Call<LinkedHashMap<String, MarkSample>> getSamples();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(" https://pbcom.firebaseio.com")
.addConverterFactory(GsonConverterFactory.create())
.build();
}
并请求:
ContactsAPI api = ContactsAPI.retrofit.create(ContactsAPI.class);
Call<LinkedHashMap<String, MarkSample>> call = api.getSamples();
call.enqueue(new Callback<LinkedHashMap<String, MarkSample>>() {
@Override
public void onResponse(Call<LinkedHashMap<String, MarkSample>> call, Response<LinkedHashMap<String, MarkSample>> response) {
LinkedHashMap<String, MarkSample>> samples = response.body();
}
@Override
public void onFailure(Call<LinkedHashMap<String, MarkSample>> call, Throwable t) {
}
});