java - 改造 JSON 请求不解析 Java 对象

标签 java json retrofit retrofit2 okhttp

最近我必须向 Pocket API 发出 JSON 请求以获取修改端点。在他们的网站上,编码的 JSON 数组应该是这样的:
https://getpocket.com/v3/send?actions=%5B%7B%22action%22%3A%22archive%22%2C%22time%22%3A1348853312%2C%22item_id%22%3A229279689%7D%5D&access_token=[ACCESS_TOKEN]&consumer_key=[CONSUMER_KEY]

第一个解决方案

我使用的是Retrofit库,我写的方法是这样的:

@Headers("X-Accept: application/json")
@FormUrlEncoded
@POST("v3/send")
Call<ModifyItem> modify(@Field("actions[]") ArrayList<String> actions,
                        @Field("access_token") String token,
                        @Field("consumer_key") String consumerKey);

class ModifyItem {
    public ArrayList<Boolean> action_results;
    public int status;
}

以及 Logging Interceptor 中从 OkHttp 生成的 JSON 请求:
actions%5B%5D=1689582274&actions%5B%5D=archive&actions%5B%5D=1505667307&access_token=[ACCESS_TOKEN]&consumer_key=[CONSUMER_KEY]

第二种解决方案

如您所见,该请求不是我需要的。当我尝试使用 POJO 类来实现它时,应该是这样的:

@Headers("X-Accept: application/json")
@FormUrlEncoded
@POST("v3/send")
Call<ModifyItem> modify(@Field("actions[]") ArrayList<Action> actions,
                        @Field("access_token") String token,
                        @Field("consumer_key") String consumerKey);

class ModifyItem {
    public ArrayList<Boolean> action_results;
    public int status;
}

以及 POJO 类:

public class Action implements Serializable {

@SerializedName("action")
@Expose
private String action;
@SerializedName("item_id")
@Expose
private String itemId;
@SerializedName("time")
@Expose
private String time;

public String getAction() {
    return action;
}

public void setAction(String action) {
    this.action = action;
}

public String getItemId() {
    return itemId;
}

public void setItemId(String itemId) {
    this.itemId = itemId;
}

public String getTime() {
    return time;
}

public void setTime(String time) {
    this.time = time;
}

@Override
public String toString() {
    return ToStringBuilder.reflectionToString(this);
}
}

但是 JSON 请求是这样的:
actions%5B%5D=com.deyanm.pocketapispike.data.Action%4075efc7d1%5Baction%3Darchive%2CitemId%3D308680025%2Ctime%3D1505669208%5D&access_token=[ACCESS_TOKEN]&consumer_key=[CONSUMER_KEY]

我的问题是如何实现所需的 JSON?谢谢

最佳答案

有两件事。首先,您的 Action 类需要一个正确的 toString() 方法。

@Override
public String toString() {
    return "{\"action\"=" + action +
           ",\"item_id\"=" + itemId +
           ",\"time\"=" + time + "}";
}

其次,actions 字段需要被识别为单个对象,而不是字段列表,因此不要直接使用 ArrayList,而是使用其 toString() 形式

Call<ModifyItem> modify(@Field("actions") String actions,
                        @Field("access_token") String token,
                        @Field("consumer_key") String consumerKey);  

然后使用 modify(actions.toString(), token, key) 而不是 modify(actions, token, key)

关于java - 改造 JSON 请求不解析 Java 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46266910/

相关文章:

java - 使用 Maven 将版本文件放入 EAR 或 WAR

php - 在通过 json 发送之前转换 unix 时间戳

android - 主线程上的 RxJava onCompleted 和 onTerminate

android - 使用 RxJava 链接改造调用

java - JPA:保留具有 OneToMany 关系的 2 个实体的问题

java - 从纯客户端调用远程 EJB(RMI over IIOP)时如何传播 JAAS Subject

java - 取消部署时 WebappClassLoader 和 Hibernate 内存泄漏?

javascript - 巴别塔 : duplicate plugin/preset error detected

ios - 如何在uitableview中搜索并显示youtube视频?

android - RXJava + 改造。每 n 秒重复一次请求