【发布时间】:2016-01-07 16:39:44
【问题描述】:
我有这个通过调用 C# Api 得到的 json 字符串(?)
"{\"PublicApiToken\":\"M6RVJcCyiVODapF0wOR/Pg==\",\"ErrorList\":[]}"
这将返回一个错误:
retrofit.RetrofitError: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 2 path $
有什么可以转换/清理的吗?我试过研究,我得到的最接近的是这个链接:Retrofit - removing some invalid characters from response body before parsing it as json
但不幸的是,它仍然无法解决我的问题。
你们解决了这个问题吗?
我的方法调用:
@Headers("Content-Type: application/json")
@POST("/authorize/AcquirePublicApiToken")
void attemptLoginToMCCServer(@Header("Content-Type") String contentType, @Header("Authorization") String authorization, @Body Authorization authorizationKey, Callback<SuccessLoginCallback> successLoginCallback);
我的宝乔:
public class Authorization {
private String consumerName;
private String username;
private String consumerKey;
private String password;
private String nonce;
private String timeStamp;
public String getConsumerName() {
return consumerName;
}
public void setConsumerName(String consumerName) {
this.consumerName = consumerName;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getConsumerKey() {
return consumerKey;
}
public void setConsumerKey(String consumerKey) {
this.consumerKey = consumerKey;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getNonce() {
return nonce;
}
public void setNonce(String nonce) {
this.nonce = nonce;
}
public String getTimeStamp() {
return timeStamp;
}
public void setTimeStamp(String timeStamp) {
this.timeStamp = timeStamp;
}
@Override
public String toString() {
StringBuffer sb = new StringBuffer();
sb.append("amx ");
sb.append(getConsumerName());
sb.append("-");
sb.append(getUsername());
sb.append(":");
sb.append(getConsumerKey());
sb.append("-");
sb.append(getPassword());
sb.append(":");
sb.append(getNonce());
sb.append(":");
sb.append(getTimeStamp());
return sb.toString();
}
}
【问题讨论】:
-
我维护的 API 也有类似的问题;它设置为返回转义字符串而不是实际的 json,因此调用者必须先取消转义字符串,然后才能解析 json。您应该能够通过应用
GsonConverter修复来删除前导和尾随引号并将\"替换为"来解决此问题。 -
或者,修复 API 以返回实际的 json 而不是讨厌的转义字符串。
-
当您尝试使用字符串连接将 json 创建为字符串时会出现此类问题,认为这正是您所需要的。请使用标准库将您的对象/响应转换为 json 字符串,而不是手动创建 json 结构化字符串。
-
看起来 JSON 在服务器端被双重序列化。您可以在客户端通过将 JSON 反序列化为字符串,然后将该字符串(然后将是没有转义的 JSON)反序列化为您的对象来修复它。
标签: java c# android json retrofit