【问题标题】:Retrofit 2.0 addConverterFactory to replace &quot with "Retrofit 2.0 addConverterFactory 将 &quot 替换为 "
【发布时间】:2016-09-06 10:19:31
【问题描述】:

在我的 JSON 字符串中,它包含 &quot,

{"value":" "Testing""}

如果没有执行任何字符串转换或替换,默认改造的解析器不会处理转义字符,我的结果中会有",所以我找到了代码here,它可以帮助我在改造的解析过程之前去掉转义字符,这里是修改代码

public class MyJsonConverter extends Converter.Factory {

public static MyJsonConverter create() {
    return create(new Gson());
}

public static MyJsonConverter create(Gson gson) {
    return new MyJsonConverter(gson);
}

private final Gson gson;

private MyJsonConverter(Gson gson) {
    if (gson == null) throw new NullPointerException("gson == null");
    this.gson = gson;
}

@Override
public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations,
                                                        Retrofit retrofit) {
    TypeAdapter<?> adapter = gson.getAdapter(TypeToken.get(type));
    return new GsonResponseBodyConverter<>(gson, adapter);
}

@Override
public Converter<?, RequestBody> requestBodyConverter(Type type,
                                                      Annotation[] parameterAnnotations, Annotation[] methodAnnotations, Retrofit retrofit) {
    TypeAdapter<?> adapter = gson.getAdapter(TypeToken.get(type));
    return new GsonRequestBodyConverter<>(gson, adapter);
}


final class GsonRequestBodyConverter<T> implements Converter<T, RequestBody> {
    private final MediaType MEDIA_TYPE = MediaType.parse("application/json; charset=UTF-8");
    private final Charset UTF_8 = Charset.forName("UTF-8");

    private final Gson gson;
    private final TypeAdapter<T> adapter;

    GsonRequestBodyConverter(Gson gson, TypeAdapter<T> adapter) {
        this.gson = gson;
        this.adapter = adapter;
    }

    @Override
    public RequestBody convert(T value) throws IOException {
        Buffer buffer = new Buffer();
        Writer writer = new OutputStreamWriter(buffer.outputStream(), UTF_8);
        JsonWriter jsonWriter = gson.newJsonWriter(writer);
        adapter.write(jsonWriter, value);
        jsonWriter.close();
        return RequestBody.create(MEDIA_TYPE, buffer.readByteString());
    }
}

final class GsonResponseBodyConverter<T> implements Converter<ResponseBody, T> {
    private final Gson gson;
    private final TypeAdapter<T> adapter;

    GsonResponseBodyConverter(Gson gson, TypeAdapter<T> adapter) {
        this.gson = gson;
        this.adapter = adapter;
    }

    @Override
    public T convert(ResponseBody value) throws IOException {
        String dirty = value.string();
        String clean = dirty.replace("<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n" +
                "<string xmlns=\"http://tempuri.org/\">","").replace("</string>","");

        clean = clean
                .replace("&quot;", "\"")\\This line!!!
                .replace("\\/", "/") ;

        try {
            return adapter.fromJson(clean);
        } finally {
            value.close();
        }
    }
}

}

当我执行这段代码时,它会在稍后的改造解析代码中失败并抛出这个错误

com.google.gson.stream.MalformedJsonException:未终止的对象位于 第 1 行第 1121 列路径 $.entry_list[0].name_value_list.highlight1_c.value

我了解此错误的含义,但是正确的方法是什么?而且我不喜欢在改造后替换转义字符 Parse the Json into POJO,因为这将是很多乱七八糟的替换。感谢您的建议。

【问题讨论】:

    标签: json parsing android-studio retrofit2 html-escape-characters


    【解决方案1】:

    我在这行代码上犯了一个错误,它应该用反斜杠转义它:在“之前”。

    .replace("&quot;", "\\\"")
    

    【讨论】:

      猜你喜欢
      • 2022-11-23
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 2016-06-16
      • 1970-01-01
      • 2019-12-03
      • 2014-10-16
      • 1970-01-01
      相关资源
      最近更新 更多