为什么我会收到 gson 异常:期望找到对象?

Why am I getting gson Exception: Expecting object found?

我正在使用 GSON API 1.7.1 有时会出现以下错误。这个版本有bug吗?是否需要升级当前版本2.x.x

com.google.gson.JsonParseException: Expecting object found: "<!DOCTYPE"
        at com.google.gson.JsonObjectDeserializationVisitor.visitFieldUsingCustomHandler(JsonObjectDeserializationVisitor.java:100)
        at com.google.gson.ReflectingFieldNavigator.visitFieldsReflectively(ReflectingFieldNavigator.java:63)
        at com.google.gson.ObjectNavigator.accept(ObjectNavigator.java:120)
        at com.google.gson.JsonDeserializationContextDefault.fromJsonPrimitive(JsonDeserializationContextDefault.java:85)
        at com.google.gson.JsonDeserializationContextDefault.deserialize(JsonDeserializationContextDefault.java:56)

服务器是google推送通知服务器GCM,

这是我的客户端代码。

Gson gson = new Gson();
com.sun.jersey.api.client.ClientResponse webResponse=  
                resource.header("Authorization", authorizationKey).
                header("Content-Type", MediaType.APPLICATION_JSON).
                post(com.sun.jersey.api.client.ClientResponse.class, payloadStr);
String responsePayload = webResponse.getEntity(String.class);
GcmResponse response = gson.fromJson(responsePayload, GcmResponse.class);   ===>>> Exception point

Is there a bug for this version?

没有。看起来您的服务器正在返回非 JSON 响应或者您传递了错误的参数,这与您使用的版本无关。

尝试检查服务器是否按预期工作并返回 JSON。

<!DOCTYPE 无效 Json;您的服务器有时会向您的客户端发送错误消息。由于您的客户端 99% 的时间都在工作,问题显然出在服务器上,而不是客户端。

但是,由于您在这里仅从客户端向我们提供了信息,因此我们无法解决问题。最好的办法是尝试捕获完整的错误消息,然后使用搜索或post 不同的问题 "Why does my android-scm server send messages that begin with <!DOCTYPE when they should be Json?"

要捕获这个完整的错误消息,我会这样做:

if(response.startsWith("<!DOCTYPE")) {
    someLoggingMethod(response);`
} else {
    // process the response