当前位置: 首页 > 面试题库 >

如何从JSONObject删除nameValuePairs密钥?

太叔马鲁
2023-03-14
问题内容

我正在开发一个Android项目,该项目需要JSONObject作为POST请求的主体。放置JSON的键和值后,我得到了以下代码行:

{
    "xxxx":"zzzzzzz",
    "yyyy":"uuuuuuu"
}

但是服务器得到以下信息:

{
    "name_value_pairs": {
                        "xxxx":"zzzzzzz",
                        "yyyy":"uuuuuuu"
    }
}

我已经尝试过JSONStringer,但是它的帮助并不大,因为Content-Type的请求是application/json

更新

我不尝试构造JSONObject,因为已经通过使用以下代码行(由@osayilgan给出的代码)完成了此操作:

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作为Body的请求,这令人失望。我注意到该键name_value_pairs会自动添加到对象中。

有人知道我该如何解决吗?


问题答案:

问题

默认情况下,翻新使用GSON将HTTP正文与JSON相互转换。用@Body注释指定的对象将传递给GSON进行序列化,该序列化基本上将JAVA对象转换为JSON表示形式。此JSON表示形式将是HTTP请求正文。

JSONObject通过name将所有键值映射存储在成员变量nameValuePairs。这是JSONObject实现的摘录:

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

当您将JSONObject传递给@Body批注时,将对这个JSONObject进行序列化,因此HTTP请求正文包含:{“ nameValuePairs”:“
actual JSON Object”}。

解:

将实际的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);

替代解决方案:

建议的解决方案之一是使用TypedInput:

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);


 类似资料:
  • 服务器收到了以第二个JSON为主体的请求,这是令人失望的。我注意到键被自动添加到对象中。 有没有人知道我该怎么解决这个问题?

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

  • 这是我的DynamoDB JSON 我需要删除从数据库所以我累了这个... 我得到以下错误... botocore.exceptions.ClientError:调用UpdateItem操作时发生错误(ValidationException):无效的UpdateExpression:语法错误;令牌:“=”,靠近:“跟踪的用户=:跟踪的用户”

  • 问题内容: 我已经打电话给其中包含。 迭代地图时,如果与指定的字符串匹配,则需要从地图中删除键。 即 包含,但我无法从中删除密钥。 而是得到错误: 问题答案: 尝试: 使用Java 1.8及更高版本,您只需一行即可完成上述操作:

  • 问题内容: 我想删除与“用户*”匹配的键。 我如何在Redis命令行中做到这一点? 问题答案: 此功能目前无法一口气完成(请参阅文档中的注释)。不幸的是,您只能使用,遍历结果,然后使用来删除每个结果。 怎么样使用bash来帮助? 要逐步执行: -获取所有键并使用awk删除不需要的多余文本。 -为每一个创建一个echo语句以将其删除。 -使用DEL语句,然后将它们传递回cli。 不建议这样做是最好的

  • 问题内容: 关闭。 这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使其成为Stack Overflow 的主题。 7年前关闭。 我想删除本地用户root的密码。我怎样才能做到这一点?我错误地设置了root用户的密码。这就是为什么phpmyadmin给出错误: 问题答案: 您需要将密码设置为空白。有两种方法: MySQL 命令: 使用命令行工具: