|
|
高大的电影票 · String Interpolation ...· 6 月前 · |
|
|
活泼的小熊猫 · 边缘函数Fetch ...· 1 年前 · |
|
|
霸气的西装 · MongoDb,如何根据某个_id值删除数据 ...· 1 年前 · |
|
|
英姿勃勃的黄豆 · python + ...· 1 年前 · |
我正在做一个安卓项目,它需要一个JSONObject作为我的帖子请求的主体。在放置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作为主体获得了请求,这是令人失望的。我注意到键
name_value_pairs
是自动添加到对象中的。
有人知道我怎么解决这个问题吗?
发布于 2014-09-26 17:51:57
发布 :
默认情况下,Retrofit使用GSON将HTTP主体转换为JSON。使用@Body注释指定的对象将传递给GSON进行序列化,后者基本上将JAVA对象转换为JSON表示。这个JSON表示将是HTTP请求体。
JSONObject按名称
nameValuePairs
将所有键值映射存储在成员变量中。以下是JSONObject实现的摘录:
public class JSONObject {
private final Map<String, Object> nameValuePairs;
}
当您将JSONObject传递给@ JSONObject注释时,这个JSONObject是被服务器化的,因此HTTP包含:{"nameValuePairs":“实际的JSONObject”}。
解决方案:
将实际的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);
替代解决方案:
如果您仍然希望将原始JSON作为HTTP发送,那么遵循Retrofit 这里 提到的解决方案。
建议的解决方案之一是使用 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);
发布于 2019-06-08 16:32:00
使用 com.google.gson.JsonObject 而不是 org.json.JSONObject .
JSONObject jsonRequest = new JSONObject();
jsonRequest.put("xxxx", "zzzzzzz");
jsonRequest.put("yyyy", "uuuuuuu");
变到
JsonObject jsonRequest = new JsonObject();
jsonRequest.addProperty("xxxx", "zzzzzzz");
jsonRequest.addProperty("yyyy", "uuuuuuu");
然后在接口中
public interface MyService {
@Headers({"Content-type: application/json",
"Accept: */*"})