我正在使用改型进行异步调用,当我收到JSON响应时,查看网络日志我看到,其中包含“ urlToImage” 字符串和一些url,但是当我的gsonfactory将其解析为json模型“ urlToImage”始终为 null 。
我generated带有JSON响应的POJO对象正在接收,并将其用作Json模型-尚未解决。
我尝试解析该响应中的另一个字符串以进行测试,并且每个字符串都很平滑,但字符串“ publishedAt”和“ urlToImage”除外。它们始终为空。
在JSON中,答案“ urlToImage”不为空:
我的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:
JSON答案示例(在提供API的网站上发布):
我的回复模型:
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();
}
@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月将这种行为称为“错误”。我不知道是我还是什么?
在我的依赖项中,我只有'com.squareup.retrofit2:converter-gson:2.5.0'
,但是当我添加'com.google.code.gson:gson:2.8.5'
时,urlToImage的值不同于null!哇。
答案 0 :(得分:2)
这是因为您明确地告诉Gson这样做。
gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES);
期望您的字段urlToImage
被映射到json键url_to_image
。
您看到JSON示例的属性已经用camelCase编写了。这些等于您在模型中定义的字段。如果您删除了字段命名策略,它将起作用。