【问题标题】:Retrofit - removing escaped characters from json acquired from C#改造 - 从从 C# 获取的 json 中删除转义字符
【发布时间】: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


【解决方案1】:

似乎只有引号 " 被转义。 cmets 中提到的最佳解决方案是尽可能让服务器修复它。如果您坚持使用它,This answer 来自您链接到的问题,几乎可以满足您的需求。只需要调整无效字符的含义即可。

此行删除答案中的前导和尾随 ()

String clean = dirty.replaceAll("(^\\(|\\)$)", "");

您想将\" 替换为",因此将上面的行更改为--

String clean = dirty.replaceAll("^\"|\"$","").replace("\\\"", "\"");

注意,这只有在上面关于引号是唯一转义字符的假设成立时才有效。

【讨论】:

  • 我上面发送的链接的问题是它不再作为 Json 对象返回,并且仍然被视为 json 正文中的字符串。
  • 哦,那些前导和尾随引号是您字符串的一部分。我们也可以把它们去掉,看看编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多