【问题标题】:Retrofit + GSON returns NULL for RegExpRetrofit + GSON 为 RegExp 返回 NULL
【发布时间】:2015-11-18 09:36:32
【问题描述】:

我在我的应用中使用 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;
}

怎么了?

【问题讨论】:

  • 从字符类中删除, .^7[0-6,8,9][0-9]{9}$ ==> ^7[0-689][0-9]{9}$
  • @Tushar 不幸的是这不是我的 JSON,所以我不能

标签: android regex gson retrofit


【解决方案1】:

您应该在GetPhones 中声明字段String full,或者如果您想为其使用不同的名称,您必须使用注释@SerializedName。例如

@SerializedName("default")
String lop_default;

在这种情况下,Gson 将使用 full 作为解析 json 的键。一般来说,这适用于您要解析的每个字段。否则你总是会得到一个空值/默认值

【讨论】:

  • 根据您发布的回复,您应该使用Call&lt;List&lt;GetPhone&gt;&gt;
  • 是的!我正在使用 ArrayList。
  • 那我就一无所知了,对不起
  • 你是对的!我发现命名错误!谢谢!
【解决方案2】:

它将返回 null,因为 Retrofit 无法找到 phone_ftm_check 变量的映射。

您需要在变量声明上添加@SerializedName("check") 注释。

所以你的 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 类。它会起作用的。

【讨论】:

  • 您不能使用默认值作为变量名。 JAVA不允许。
  • 是的!这是关于命名的愚蠢问题))谢谢你的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多