我在json答案中看到字符串“ urlToImage”,但是我的gsonfactory无法解析它!为什么?

时间:2019-03-31 19:10:20

标签: java android json gson

已解决

我正在使用改型进行异步调用,当我收到JSON响应时,查看网络日志我看到,其中包含“ urlToImage” 字符串和一些url,但是当我的gsonfactory将其解析为json模型“ urlToImage”始终为 null

generated带有JSON响应的POJO对象正在接收,并将其用作Json模型-尚未解决。

我尝试解析该响应中的另一个字符串以进行测试,并且每个字符串都很平滑,但字符串“ publishedAt”和“ urlToImage”除外。它们始终为空。


在JSON中,答案“ urlToImage”不为空:

answe


我的JSON模型:

public class Article {

    private Source source;
    private String title;
    private String description;
    private String urlToImage;

----< constructor, getters and setters >----

  private class Source {

        private String name;

----< constructor, getters and setters >----
  }
}

我在其中看到完整解析的json的断点。我也看到urlToImage始终为null:

null


JSON答案示例(在提供API的网站上发布):

example


我的回复模型:

public class JSONResponseArticles {
    private String status;
    private Article[] articles;

    public Article[] getArticles() {
        return articles;
    }
}

我的GSON工厂(github)

    @Provides
    @Singleton
    Gson provideGson() {
        GsonBuilder gsonBuilder = new GsonBuilder();
        gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES);
        return gsonBuilder.create();
    }

更新1

@MC_Emperor注意到,我的gsonbuilder设置了FieldNamingPolicy。完整:

gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES); 所以:

  • 我尝试将urlToImage重命名为url_to_image-无效,仍为null;

  • 我尝试设置FieldNamingPolicy.IDENITY文档:“使用 Gson的这种命名策略将确保字段名称为 不变。”-无效,仍为null。

  • 我删除了FieldNamingPolicy-没有效果。

  • 我删除了GSON生成器,现在我像通过gsonfactory一样 .addConverterFactory(GsonConverterFactory.create())何时 创建改造对象-无效,仍为null。


我还在Retrofit的github问题上发现了此thread,开发人员在2015年9月将这种行为称为“错误”。我不知道是我还是什么?


更新2

在我的依赖项中,我只有'com.squareup.retrofit2:converter-gson:2.5.0',但是当我添加'com.google.code.gson:gson:2.8.5'时,urlToImage的值不同于null!哇。

1 个答案:

答案 0 :(得分:2)

这是因为您明确地告诉Gson这样做。

gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES);

期望您的字段urlToImage被映射到json键url_to_image

您看到JSON示例的属性已经用camelCase编写了。这些等于您在模型中定义的字段。如果您删除了字段命名策略,它将起作用。