使用Retrofit错误com.google.gson.JsonSyntaxException获取base64图像:java.lang.IllegalStateException:

时间:2015-01-27 07:38:35

标签: android retrofit

我正在尝试从经过身份验证的网站下载图片。该站点返回base64版本的映像。这是改造的正确方法吗?如何获取图像并设置为我的图像视图。

    @GET("/img/avatars/{id}")
    public void getProfilePic(@Path("id") int id,
                          Callback<TypedByteArray> result);

我将我的restadapter日志记录设置为完整,响应值看起来像这样

���V�3��Ωw���Tw�5�vT��>8u�`�j�S�������#���%�A���"Xw��Oq������G@]éG���f�~A#lD�)<���•

不是base64字符串。

我尝试了什么

customResAdapter(ImageService.class).getProfilePic(id, new Callback<TypedByteArray>() {
            @Override
            public void success(TypedByteArray result, Response response) { 
                try {
                    byte[] decodedString = Base64.decode(result.getBytes(), Base64.DEFAULT);
                    mProfilePic.setImageBitmap(BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length));

                } catch (Exception e) {
                    e.printStackTrace();

                } 
            }

            @Override
            public void failure(RetrofitError error) { 
            }
        });

我不知道以下代码是否正确,但目前我收到此错误消息

  

com.google.gson.JsonSyntaxException:   java.lang.IllegalStateException:预期为BEGIN_OBJECT但是为STRING   在第1行第1列路径

1 个答案:

答案 0 :(得分:0)

如果您正在使用GsonConverter,则总是会以JsonParseException结尾。您需要继承GsonConverter并避免使用JsonParseExceptions并继续处理Response本身。

验证子类Converter中的Json响应将为您提供如何处理反序列化的提示。 换句话说,如果json有效,则将其传递给GsonConverter,否则从Base64解码。

public class TypedByteArrayConverter extends GsonConverter {
    public TypedByteArrayConverter(Gson gson) {
        super(gson);
    }

    public TypedByteArrayConverter(Gson gson, String charset) {
        super(gson, charset);
    }

    @Override
    public Object fromBody(TypedInput body, Type type) throws ConversionException {
        //if you are trying to deserialize POJO from json, make a supercall, otherwise convert to TypedByteArray
        if(!type.getClass().isAssignableFrom(TypedByteArray.class)) {
           return super.fromBody(body, type);
        }else {
            try {
                long length = body.length();
                ByteString base64 = ByteString.read(body.in(), (int) length);
                return new TypedByteArray(body.mimeType(), base64.toByteArray());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }
}

ByteString来自Okio

然而,使用Retrofit加载图像是一个相当奇怪的想法。