Android Retrofit预计BEGIN_OBJECT但是STRING在第1行第1列路径$

时间:2015-10-05 23:46:50

标签: android json gson retrofit okhttp

我在Android应用程序中使用okhttp Retrofit来发出网络请求。在其中一个请求中,我收到此错误:

com.google.gson.JsonSyntaxException:java.lang.IllegalStateException:预期为BEGIN_OBJECT,但在第1行第1行路径为STRING

我在日志中看到201响应,但Retrofit会抛出此错误。以下是我的代码。

signup(signupParams, new Callback<Member>() {
            @Override
            public void success(Member member, Response response) {
                if (member != null) {
                    UserAccount userAccount = new UserAccount(member);
                    userAccount.save();
            }

            @Override
            public void failure(RetrofitError re) {
                BusProvider.post(new SignupFailedEvent(re, email));
            }
        });

signupParams值为 -

{"emailAddress":"test@gmail.com","password":"tester123","userSource":"APH"}

我用jsonLint测试了这个json,它是一个有效的json。这是我的会员类,理想情况下应该是回应。

public class Member {
    public String emailAddress;
    public String token;
    public long id;
    public String firstName;
    public String lastName;
}

响应的示例应该是这样的:

{
    "emailAddress": "test@gmail.com",
    "id": 1437811,
    "token": "sdhshdghsdhhsdbcjhbsjdhc",
    "firstName": "John",
    "lastName": "Smith"
}

3 个答案:

答案 0 :(得分:1)

如果您为Member类发布的源代码是准确的,那么您没有得到您认为自己的响应JSON。

错误消息表示JSON解析器找到了一个预期复杂对象的String。

由于Member类中没有任何复杂对象,结果可能只是无效的JSON(它不是以一个开头的大括号开头)。

尝试按其中一条评论中的建议启用Retrofit中的详细日志记录,或使用“Postman”等工具将相同的数据发布到API,并查看结果实际是什么。

答案 1 :(得分:0)

这是因为。您的响应未json格式化。它可以包含字符串或预期}。要识别此。您必须与邮递员联系,并将正文中的视图类型更改为HTML。在那里,您可以看到完整的响应,并且可以使用* https://jsonlint.com/进行验证。否则为Dynamic json。您可以使用JsonElement作为响应。

答案 2 :(得分:0)

如果您确定邮递员可以工作,并且模型与JSON参数相同,

也许您在请求标头中使用了“ accept-encoding:gzip”之类。

retrofit不适用于gzip,请将其从标题中删除。