当前位置: 首页 > 知识库问答 >
问题:

如何从JSONObject中删除nameValuePairs键?

颜森
2023-03-14
{
    "xxxx":"zzzzzzz",
    "yyyy":"uuuuuuu"
}
{
    "name_value_pairs": {
                        "xxxx":"zzzzzzz",
                        "yyyy":"uuuuuuu"
    }
}
JSONObject jsonRequest = new JSONObject();
jsonRequest.put("xxxx", "zzzzzzz");
jsonRequest.put("yyyy", "uuuuuuu");
public interface MyService {
    @Headers({"Content-type: application/json",
              "Accept: */*"})
    @POST("/test")
    void testFunction(@Body JSONObject jsonObject, Callback<Response> callback);
}

服务器收到了以第二个JSON为主体的请求,这是令人失望的。我注意到键name_value_pairs被自动添加到对象中。

有没有人知道我该怎么解决这个问题?

共有1个答案

浦出野
2023-03-14

问题:

默认情况下,reverfit使用GSON将HTTP主体转换为JSON。用@body注释指定的对象将被传递给GSON进行序列化,这基本上将JAVA对象转换为JSON表示。这个JSON表示将是HTTP请求体。

JSONObject通过名称namevaluepairs将所有键-值映射存储在成员变量中。这里是JSONObject实现的节选:

public class JSONObject {
    ...
    private final Map<String, Object> nameValuePairs;
    ...
}

将实际的JAVA对象传递给@body注释,而不是它对应的JSONObject。GSON将负责将其转换为JSON表示。

对于例如。

class HTTPRequestBody {
   String key1 = "value1";
   String key2 = "value2";
   ...
}

// GSON will serialize it as {"key1": "value1", "key2": "value2"}, 
// which will be become HTTP request body.

public interface MyService {
    @Headers({"Content-type: application/json",
              "Accept: */*"})
    @POST("/test")
    void postJson(@Body HTTPRequestBody body, Callback<Response> callback);
}

// Usage
MyService myService = restAdapter.create(MyService.class);
myService.postJson(new HTTPRequestBody(), callback);

替代解决方案:

public interface MyService {
  @POST("/test")
  void postRawJson(@Body TypedInput body, Callback<Response> callback);
}

String json = jsonRequest.toString();
TypedInput in = new TypedByteArray("application/json", json.getBytes("UTF-8"));
myService.postRawJson(in, callback);
 类似资料:
  • 问题内容: 我正在开发一个Android项目,该项目需要JSONObject作为POST请求的主体。放置JSON的键和值后,我得到了以下代码行: 但是服务器得到以下信息: 我已经尝试过JSONStringer,但是它的帮助并不大,因为的请求是。 更新 我不尝试构造JSONObject,因为已经通过使用以下代码行(由@osayilgan给出的代码)完成了此操作: 这不是问题。下述接口用于与服务器通信

  • 问题内容: 我正在使用net.sf.json.JSONObject创建一些要发送到前端应用程序的数据,并且正在与之交互的代码不喜欢其在每个字段名称中添加引号的方式。 例如: 产生字符串{“ JSON”:“ Hello,World”}。 我希望它返回的是{JSON:“ Hello,World”}-在“ JSON”周围没有引号。我该怎么做才能做到这一点? 问题答案: 在javadoc中说: toStr

  • 问题内容: 我有如下的JsonObject 如何通过使用Java中的方法从JsonObject中删除Json密钥“电子邮件”及其值 JsonObj.removev为我工作,如果我需要删除状态键 更新资料 更多背景信息,这主要是为了测试休息点。在我的测试中,我使用Builder模式创建了与有效负载匹配的Java对象,然后使用GsonBuilder像这样隐蔽了Json 如果需要删除我使用的必填字段,请

  • 一些更多的背景,这主要是为了测试一个restendpoint。在我的测试中,我使用Builder模式创建了与有效负载匹配的java对象,然后使用GsonBuilder隐藏到Json中,如 如果我需要删除我所使用的一个必需字段,请在上面的函数创建的Json对象上删除jsonobj.remove(“key”)。

  • 问题内容: 在每行末尾添加\ n,结束程序正常工作,仅在最后一行工作… 请举个例子,我在任何解决方案中都尝试不了什么,而我发现这里不适合我。 问题答案: 您可以分割最后一个字符: 也许更好的方法是使用字符串库:

  • 问题内容: 如何从静态页面的网址中删除? 另外,我需要将任何网址重定向到没有该网址的网址。(即到)。 问题答案: 感谢您的答复。我已经解决了我的问题。假设我的页面在下,则适用以下.htaccess 规则。