【问题标题】:Expected a string but was BEGIN_OBJECT at line 3 column 4 path $.SUCCESS应为字符串,但在第 3 行第 4 列路径 $.SUCCESS 处为 BEGIN_OBJECT
【发布时间】:2021-01-13 19:08:06
【问题描述】:

我用 Retrofit2 做了一个发布请求方法,但我在回复中遇到了这个问题。

Expected a string but was BEGIN_OBJECT at line 3 column 4 path $.SUCCESS

响应应该是

{
"SUCCESS" :
{
"200" : "access granted",
"ra" : "approved",
"la" : "approved",
"ch" : "approved"
}
}

我将此代码用于发布请求

@POST("login")
Call<Post> createPost(@Body Post post);

对于 POJO 类

public class Post {

    private String anthony;
    private String SUCCESS;

    public Post(String name) {
        this.anthony = name;
    }

    public String getSUCCESS() {
        return SUCCESS;
    }
}

对于我使用以下代码的方法

private void createPost() {
        Post post = new Post("mypassword");
        Call<Post> call = jsonPlaceHolderApi.createPost(post);

        call.enqueue(new Callback<Post>() {
            @Override
            public void onResponse(Call<Post> call, Response<Post> response) {
                if (!response.isSuccessful()) {
                    textViewResult.setText("Code: " + response.code());
                    return;
                }
                Post postResponse = response.body();
                String content = "";
                content += "Code: " + response.code() + "\n";
                content += "S" + postResponse.getSUCCESS();
                textViewResult.setText(content);
            }
            @Override
            public void onFailure(Call<Post> call, Throwable t) {
                textViewResult.setText(t.getMessage());
            }
        });
    }

有人知道我的代码有什么问题吗?我希望在“SUCCESS”json 对象中得到响应。

【问题讨论】:

  • private String SUCCESS; 与数据不匹配 "SUCCESS" : { "200" : "acc ...
  • 有什么线索可以让我得到回复吗? @luk2302

标签: java android json post retrofit


【解决方案1】:

您希望 SUCCESS 成为您想要的响应中的一个对象,但您已在 Post 类中将其定义为字符串。您应该使用一个对象来代替 SUCCESS。

public class Post {

    private String anthony;
    private PostSuccess SUCCESS;

    public Post(String name) {
        this.anthony = name;
    }

    public PostSuccess getSUCCESS() {
        return SUCCESS;
    }
}

public class PostSuccess {
    @JsonProperty("200")
    private String _200;
    private String ra;
    private String la;
    private String ch;
}

【讨论】:

  • 我从哪里获得@JsonProperty?
  • 来自Jackson Java library。如果可以避免称为“200”的属性,则不需要它,因为它不是有效的 Java 标识符。
  • 在我删除 @JsonProperty 和“200”响应后,我在 getSuccess 响应中收到 Post$PostSuccess@2f5769f。这非常令人困惑。
  • 您应该熟悉 Java 基础知识。打印 post.getSuccess() 将返回 PostSuccess 的 toString() 结果(这是默认设置)。您可以覆盖 PostSuccess 的 toString() 或使打印更具体(例如 post.getSuccess().getRa(),不要忘记 PostSuccess 中的 getter)
  • 好的,非常感谢。试了之后,终于成功了!!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-03
  • 1970-01-01
  • 2022-07-20
  • 1970-01-01
  • 1970-01-01
  • 2021-09-14
  • 1970-01-01
相关资源
最近更新 更多