JSON 错误 “java.lang.IllegalStateException: expected BEGIN_OBJECT 但在第 1 行第 1 列路径 $” 处是 STRING

2022-09-05 00:33:46
public interface UserService {
    @POST(Constants.Api.URL_REGISTRATION)
    @FormUrlEncoded
    BaseWrapper registerUser(@Field("first_name") String firstname, @Field("last_name") String lastname, @Field("regNumber") String phone, @Field("regRole") int role);


 public BaseWrapper registerUser(User user) {
        return getUserService().registerUser(user.getFirstName(), user.getLastName(), user.getPhone(), user.getRole());
    }

此创建异常

 com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $

非常感谢您的帮助。


答案 1

让我们看一下您收到的错误。

预期BEGIN_OBJECT

您的 JSON 是一个对象,所有 JSON 对象都括在大括号 ({}) 中。因此,BEGIN_OBJECT是 {.它期待在某个地方。

但被串起来

但他却发现了一个字符串“Something”。仍然没有告诉我们在哪里。

在第 1 行列 1 路径 $

啊,完美。在第 1 行,第 1 列。这是 JSON 的开始。所以你忘了把整个东西都括在{}里(或者至少你忘记了第一个,但我敢打赌你已经忘记了它们)。


答案 2

最近,我遇到了类似的问题,并且仅通过将“Accept:application/ json”添加到标头部分来解决。因此,如果您使用的是改造2.0;

第一个解决方案:对于post方法,添加标题参数如下;

@Headers({"Accept: application/json"})
@POST(Constants.Api.URL_REGISTRATION)
@FormUrlEncoded
BaseWrapper registerUser(@Field("first_name") String firstname, 
                         @Field("last_name") String lastname, 
                         @Field("regNumber") String phone, 
                         @Field("regRole") int role);

第二种解决方案:像这样将标头添加到您的拦截器类中;

注意:代码在 kotlin 中

private fun getInterceptor(): Interceptor {
        try {
            return Interceptor {
                val request = it.request()
                it.proceed(
                    request.newBuilder()
                        .header("Accept", "application/json")
                        .header("Authorization", "$accessTokenType $accessToken")
                        .build()
                )
            }
        } catch (exception: Exception) {
            throw Exception(exception.message)
        }
    }
}

希望它有帮助,快乐编码:)