Retrofit + GSON returns NULL for RegExp
Retrofit + GSON returns NULL for RegExp
我在带有 GSON 转换器的应用程序中使用 Retrofit 2.0。
在我的 JSON 中,我有 6 个字段,3 个用于 int 和 String,其中 3 个由正则表达式组成(1 个 int 用于 "id",模型 Class 中有 5 个 String 字段) .
String 和 int fiends 解析得很好,但在具有 RegExp GSON returns 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());
}
});
和模型 class:
public class GetPhones {
int id;
String iso;
String name;
String lop_check;
String lop_full;
String lop_default;
}
怎么了?
您应该在 GetPhones
中声明字段 String full
,或者如果您想为其使用不同的名称,则必须使用注释 @SerializedName
。例如
@SerializedName("default")
String lop_default;
在这种情况下,Gson 将使用 full
作为解析您的 json 的键。通常,这适用于您要解析的每个字段。否则你将永远得到一个null/default值
它将 return 为空,因为 Retrofit 无法找到 phone_ftm_check 变量的映射。
您需要在变量声明上添加@SerializedName("check") 注释。
所以你的 POJO class 应该如下所示:
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 class。它会起作用。
我在带有 GSON 转换器的应用程序中使用 Retrofit 2.0。
在我的 JSON 中,我有 6 个字段,3 个用于 int 和 String,其中 3 个由正则表达式组成(1 个 int 用于 "id",模型 Class 中有 5 个 String 字段) .
String 和 int fiends 解析得很好,但在具有 RegExp GSON returns 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());
}
});
和模型 class:
public class GetPhones {
int id;
String iso;
String name;
String lop_check;
String lop_full;
String lop_default;
}
怎么了?
您应该在 GetPhones
中声明字段 String full
,或者如果您想为其使用不同的名称,则必须使用注释 @SerializedName
。例如
@SerializedName("default")
String lop_default;
在这种情况下,Gson 将使用 full
作为解析您的 json 的键。通常,这适用于您要解析的每个字段。否则你将永远得到一个null/default值
它将 return 为空,因为 Retrofit 无法找到 phone_ftm_check 变量的映射。
您需要在变量声明上添加@SerializedName("check") 注释。
所以你的 POJO class 应该如下所示:
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 class。它会起作用。