我在我的应用程序中使用Retrofit 2.0和GSON转换器。
在我的JSON中,我有6个字段,3个用于int和String,其中3个由RegExps组成(1个int用于" id"以及5个String字段在模型类中)。
对String和int fiends进行了很好的解析,但在使用RegExp的字段上,GSON返回NULL。
以下是JSON的例子:
[
{
"id": "22",
"iso": "TTR",
"name": "Lolo",
"check": "^77",
"full": "^77[0-9]{9}$",
"default": "+77"
},
{
"id": "23",
"iso": "RTT",
"name": "Polo",
"check": "^7",
"full": "^7[0-6,8,9][0-9]{9}$",
"default": "+7"
}
]
和片段中的代码:
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(URL_API)
.client(SSLSuppressClient.trustcert())
.addConverterFactory(GsonConverterFactory.create())
.build();
GetPhones getPhonesInfo = retrofit.create(GetPhones.class);
Call<ArrayList<GetPhones> call = getPhonesInfo.getPhones();
call.enqueue(new Callback<ArrayList<GetPhones>>() {
@Override
public void onResponse(Response<ArrayList<GetPhones>> response, Retrofit retrofit) {
Toast.makeText(getActivity(), "Success!", Toast.LENGTH_SHORT).show();
}
@Override
public void onFailure(Throwable t) {
Toast.makeText(getActivity(), "Failure!", Toast.LENGTH_SHORT).show();
Log.d("LOG", t.getMessage());
}
});
和模型类:
public class GetPhones {
int id;
String iso;
String name;
String lop_check;
String lop_full;
String lop_default;
}
问题是什么?
答案 0 :(得分:2)
您应该在String full
中声明字段GetPhones
,或者如果您想为其使用其他名称,则必须使用注释@SerializedName
。 E.g。
@SerializedName("default")
String lop_default;
在这种情况下,Gson将使用full
作为解析json的密钥。通常,这适用于要解析的每个字段。否则,您将始终获得null / default值
答案 1 :(得分:1)
它将返回null,因为Retrofit无法找到phone_ftm_check变量的映射。
您需要在变量声明中添加@SerializedName(&#34; check&#34;)注释。
所以你的POJO课程应如下所示:
public class GetPhones {
int id;
String iso;
String name;
@SerializedName("check")
String phone_ftm_check;
@SerializedName("full")
String phone_ftm_full;
@SerializedName("default")
String phone_ftm_default;
}
试试这个POJO课程。它会起作用。