【问题标题】:How to pass JsonArray with no name as request in retrofit body如何在改造主体中传递没有名称的 JsonArray 作为请求
【发布时间】:2017-05-24 15:02:26
【问题描述】:

我想在 Retrofit 主体中传递没有名称的 Json 数组,但出现 400 错误。我想通过 pojo 传递这个没有名称的 json 数组。下面是我想要传递的 json 数组。我也是为此使用 PATCH 方法。

[{
"op": "replace",
"path": "/billing_address/line1",
"value": "some other value"}]

我正在使用以下方法,在此方法中,我在 logcat 中获得了与我想要的列表相同的响应,但在将它传递到 getAuthentionToken 中后,我收到 400 错误。

        Call<JSONResponse> getAuthentionToken(@Body List obj);


    JSONObject jobj = new JSONObject();
    jobj.put("op","replace");
    jobj.put("path","/billing_address/line1");
    jobj.put("value","some other value");


    List arrlist = new ArrayList();
    arrlist.add(jobj);


    apiInterface.getAuthentionToken(arrlist).enqueue(new Callback<JSONResponse>() {

【问题讨论】:

  • 到目前为止你尝试了什么??
  • 我试图通过创建 json 对象并在 json 数组中传递相同的内容来传递 json 数组...我在 logcat 中的响应与我想要的相同,但是当我在改造体内传递这个 json 数组对象时,我是得到错误。所以我更喜欢为此选择 pojo,但我仍然得到错误
  • 您必须提供参数名称(或字段名称)
  • 你能用代码解释一下你想说什么吗?

标签: android arrays json retrofit pojo


【解决方案1】:

如果您通过请求正文发送数据,您的实现应该是这样的:

  1. 根据字段定义模型(区分大小写的“名称” -> 字符串名称等)
  2. 也可以这样设置你的 api 函数

@POST("/api/geo/getLoc") public void getFriendsLocation(@Body YourClass classObject, Callback<JsonElement> response);

  1. 在发布请求时直接使用您创建的类对象

    getFriendsLocation(yourClassObjectThatIncludesFields, new Callback .... );

如果您通过参数发送数据,您可以使用 Gson 执行此操作。
1. 假设您有一个具有 id 、 number 和 FriendNumber 等字段的类。定义一个函数:

public static Map<String, Object> getMapFromObject(Object o) {
    Gson gson = new Gson();
    Type stringObjectMap = new TypeToken<Map<String, Object>>() {
     }.getType();
    return gson.fromJson(gson.toJson(o), stringObjectMap);
}

2。也可以这样设置你的 api 函数

@POST("/api/geo/getLoc")
public void getFriendsLocation(@QueryMap Map<String, Object>,     Callback<JsonElement> response);
  1. 当您从您的字段发送发布请求创建对象时,请调用此函数,如下所示

    getFriendsLocation(getMapFromObject(yourClassObjectThatIncludesFields), new Callback .... );

我没有编写包含类定义和回调函数的整个代码,因为它们取决于您的自定义。我认为您需要通过 body 发送,因此请尝试第一种方式。

【讨论】:

  • 如果没有帮助,您可以回复我!并且不要忘记投票!鼓励!
  • 它是否适用于 PATCH 方法,因为我想使用 PATCH 方法而不是 POST
  • 看这个问题的第一个答案stackoverflow.com/questions/19797842/…
【解决方案2】:

以下是我的正确答案,它的工作正常。

公共类 CardUpdate {

public String op;
public String path;
public String value;

public CardUpdate(String op, String path, String value) {

    this.op = op;
    this.path = path;
    this.value = value;
}

public String getOp() {
    return op;
}

public void setOp(String op) {
    this.op = op;
}

public String getPath() {
    return path;
}

public void setPath(String path) {
    this.path = path;
}

public String getValue() {
    return value;
}

public void setValue(String value) {
    this.value = value;
}

@Override
public String toString() {
    /*return "CardUpdate{" +
            "op='" + op + '\'' +
            ", path='" + path + '\'' +
            ", value='" + value + '\'' +
            '}';*/

    return "{" +'"'+
            "op"  + '"'+":" +'"' +op + '"'+
            "," + '"'+"path"  + '"'+":" + '"'+ path  + '"'+
            "," + '"'+"value" + '"'+":" + '"'+ value  + '"'+
            '}';
}

}

    CardUpdate updatt = new CardUpdate("replace","/billing_address/line1","some other value");
    List<CardUpdate> cardddd = new ArrayList<CardUpdate>();
    cardddd.add(updatt);

【讨论】:

  • 请添加一些详细信息来解释“为什么”这样有效。响应“this is the answer”的代码并没有解释 OP 应该注意什么。
  • 你好,我通过使用这个结构得到了成功的响应。出于隐私原因,我不能将响应和 url 放在相同的位置。
猜你喜欢
  • 2022-10-06
  • 2016-03-22
  • 2016-12-17
  • 2021-01-12
  • 1970-01-01
  • 2018-07-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多