最近我必须向 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/