如果json字段类型动态更改,如何使用改进来处理json响应

时间:2016-07-20 07:23:22

标签: android gson retrofit2

我正在使用改造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方法。 没有得到如何做到这一点。可以做任何事情,而不是在后端改变它吗?帮助欣赏!

3 个答案:

答案 0 :(得分:0)

您似乎将likeUserIdlikeUserId定义为Integer。但是,在JSON中,like_idlike_user_id"",而String代替Integer

答案 1 :(得分:0)

而不是使用它(&#34;&#34;)..您也可以使用likeUserId=null并在获取值之前..检查空值..

答案 2 :(得分:0)

在得到评论员的帮助后,我发现使用这种使用反射分配值的库,无法处理这样的回复

因为服务器可能一起提供无效的json ,所以它实际上是无效的json,因为服务器正在破坏它自己的架构。它可能会以某种方式完成解决方法,但这不是一个好目标。

所以,我最终使用另一个库来解析这个响应。