我正在使用改造2来解析api。 对于某些响应,它已成功完成,但对于某些响应,它会停止并显示错误
com.google.gson.JsonSyntaxException:java.lang.NumberFormatException: 无效的双倍:""
成功解析的响应是:
{
"post_list": [{
"like_count": "1",
"like_id": 47,
"like_user_id": 24,
"like_full_name": "Zika zika",
"like_full_image": "http:\/\/graph.facebook.com\/123456789\/picture?type=large",
"comment_count": 7,
"comment_id": 235,
"comment_text": "Xhhc",
"comment_user_id": 22,
"comment_full_name": "Azz Sha",
"comment_full_image": "http:\/\/demo.net\/apps\/demo\/web\/img\/uploads\/abc.jpg"
}],
"is_last": "N",
"code": 200,
"status": "Success"
}
失败者是:
{
"post_list": [{
"like_count": "0",
"like_id": "",
"like_text": "",
"like_user_id": "",
"like_full_name": "",
"like_full_image": "",
"comment_count": 0,
"comment_id": "",
"comment_text": "",
"comment_user_id": "",
"comment_full_name": "",
"comment_full_image": ""
}],
"is_last": "N",
"code": 200,
"status": "Success"
}
和PostList类:
@SerializedName("like_count")
private String likeCount;
@SerializedName("like_id")
private Integer likeId;
@SerializedName("like_user_id")
private Integer likeUserId;
@SerializedName("like_full_name")
private String likeText;
@SerializedName("like_text")
private String likeFullName;
@SerializedName("like_full_image")
private String likeFullImage;
@SerializedName("comment_count")
private Integer commentCount;
@SerializedName("comment_id")
private String commentId;
@SerializedName("comment_text")
private String commentText;
@SerializedName("comment_user_id")
private String commentUserId;
@SerializedName("comment_full_name")
private String commentFullName;
@SerializedName("comment_full_image")
private String commentFullImage;
//getter setters
我不太了解改造,但我尝试使用此类作为反序列化程序,参考this但仍然没有运气。
public class TimelineDeserializer implements JsonDeserializer<PostList> {
@Override
public PostList deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
Gson gson = new Gson();
PostList postList=gson.fromJson(json, PostList.class);
final JsonObject jsonObject = json.getAsJsonObject();
if(postList.getLikeCount().equals("0")){
final int likeId=jsonObject.get("like_id").getAsInt();
final int likeUserID=jsonObject.get("like_user_id").getAsInt();
postList.setLikeId(likeId);
postList.setLikeUserId(likeUserID);
}
return postList;
}
}
初始化改造:
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(PostList.class, new TimelineDeserializer());
Gson gson = new GsonBuilder()
.setLenient()
.create();
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).build();
retrofit = new Retrofit.Builder().baseUrl(BASE_URL)
.client(client)
.addConverterFactory(GsonConverterFactory.create(gson)).build();
我在日志中获取响应主体,但遇到onFailure方法。 没有得到如何做到这一点。可以做任何事情,而不是在后端改变它吗?帮助欣赏!
答案 0 :(得分:0)
您似乎将likeUserId
和likeUserId
定义为Integer
。但是,在JSON中,like_id
和like_user_id
为""
,而String
代替Integer
。
答案 1 :(得分:0)
而不是使用它(&#34;&#34;)..您也可以使用likeUserId=null
并在获取值之前..检查空值..
答案 2 :(得分:0)
在得到评论员的帮助后,我发现使用这种使用反射分配值的库,无法处理这样的回复。
因为服务器可能一起提供无效的json ,所以它实际上是无效的json,因为服务器正在破坏它自己的架构。它可能会以某种方式完成解决方法,但这不是一个好目标。
所以,我最终使用另一个库来解析这个响应。