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。它会起作用。