首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从nameValuePairs中删除JSONObject密钥?

如何从nameValuePairs中删除JSONObject密钥?
EN

Stack Overflow用户
提问于 2014-09-24 16:37:17
回答 8查看 20.6K关注 0票数 33

我正在做一个安卓项目,它需要一个JSONObject作为我的帖子请求的主体。在放置JSON的键和值之后,我得到了以下行:

代码语言:javascript
运行
复制
{
    "xxxx":"zzzzzzz",
    "yyyy":"uuuuuuu"
}

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

代码语言:javascript
运行
复制
{
    "name_value_pairs": {
                        "xxxx":"zzzzzzz",
                        "yyyy":"uuuuuuu"
    }
}

我已经尝试过一个JSONStringer,但是它并没有多大帮助,因为请求的Content-Typeapplication/json

更新

我不想构建JSONObject,因为它已经使用了下面的代码行(@osayilgan给出的代码相同):

代码语言:javascript
运行
复制
JSONObject jsonRequest = new JSONObject();
jsonRequest.put("xxxx", "zzzzzzz");
jsonRequest.put("yyyy", "uuuuuuu");

这不是问题所在。下面描述的接口用于与服务器通信。

代码语言:javascript
运行
复制
public interface MyService {
    @Headers({"Content-type: application/json",
              "Accept: */*"})
    @POST("/test")
    void testFunction(@Body JSONObject jsonObject, Callback<Response> callback);
}

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

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

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2014-09-26 17:51:57

发布

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

JSONObject按名称nameValuePairs将所有键值映射存储在成员变量中。以下是JSONObject实现的摘录:

代码语言:javascript
运行
复制
public class JSONObject {
    ...
    private final Map<String, Object> nameValuePairs;
    ...
}

当您将JSONObject传递给@ JSONObject注释时,这个JSONObject是被服务器化的,因此HTTP包含:{"nameValuePairs":“实际的JSONObject”}。

解决方案:

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

例如:

代码语言:javascript
运行
复制
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);

替代解决方案:

如果您仍然希望将原始JSON作为HTTP发送,那么遵循Retrofit 这里提到的解决方案。

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

代码语言:javascript
运行
复制
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);
票数 33
EN

Stack Overflow用户

发布于 2019-06-08 16:32:00

使用com.google.gson.JsonObject而不是org.json.JSONObject.

代码语言:javascript
运行
复制
JSONObject jsonRequest = new JSONObject();
jsonRequest.put("xxxx", "zzzzzzz");
jsonRequest.put("yyyy", "uuuuuuu");

变到

代码语言:javascript
运行
复制
JsonObject jsonRequest = new JsonObject();
jsonRequest.addProperty("xxxx", "zzzzzzz");
jsonRequest.addProperty("yyyy", "uuuuuuu");

然后在接口中

代码语言:javascript
运行
复制
public interface MyService {
    @Headers({"Content-type: application/json",
              "Accept: */*"})
    @POST("/test")
    void testFunction(@Body JsonObject jsonObject, Callback<Response> callback);
}

JSONObject类在LinkedHashMap中保留变量名为nameValuePairs的值,当Gson试图将JSONObject的实例转换为JSON时,GSON保持结构(其中包含变量nameValuePairs)。导致了这个问题。

票数 11
EN

Stack Overflow用户

发布于 2019-06-07 06:19:07

你必须把JSONObject藏到GSON的JsonObject上

走这条路

代码语言:javascript
运行
复制
 JsonParser jsonParser = new JsonParser();
  JsonObject jsonObject = (JsonObject)jsonParser.parse(actualjsonobject.toString());

然后进入身体

代码语言:javascript
运行
复制
HashMap<String,Object> body=new HashMap();

 body.put("content",jsonObject);
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26022133

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档