2017-07-06 6 views
1

私は改造呼び出しをしようとしていますが、私はMalformedJsonExceptionを取得しています。RetrofitとGsonのMalformedJsonException

これは私の呼び出しです:

String idFoto = "1ead0a1f-bbc4-46bd-901c-7988c0e6c68b"; 
Retrofit retrofit = new Retrofit.Builder() 
    .baseUrl(Global.URL_BASE) 
    .addConverterFactory(GsonConverterFactory.create()) 
    .build(); 
FotosAPI service = retrofit.create(FotosAPI.class); 
Call<String> obtenerFotoCall = service.getFoto(Global.getToken(), idFoto); 

は、これが私のインターフェイスです:

public interface FotosAPI { 
    @GET(Global.URL_FOTO + "{id}") 
    Call<String> getFoto(@Header("Authorization") String token, @Path("id") String id); 
} 

コールエンキューはONFAILURE方法を入力し、エラーは「com.google.gson.stream.MalformedJsonExceptionです。 JsonReader.setLenient(true)を使用して、行1の列2のパス$ "で不正な形式のJSONを受け入れます。私はこのような寛大設定を変更した

:「com.google.gson.stream.MalformedJsonException:行1列1パス$での期待値」すると

Gson gson = new GsonBuilder().setLenient().create(); 
Retrofit retrofit = new Retrofit.Builder() 
    .baseUrl(Global.URL_BASE) 
    .addConverterFactory(GsonConverterFactory.create(gson)) 
    .build(); 

、私は別のエラーを持っています

私はこのエラーがidFoto文字列値のGsonの変換にあると思われますが、何が間違っているのか分かりません。

誰かが私を助けてくれますか?

ありがとう!

+1

あなたは 'ToStringConverterFactory'を必要とすべきである私はあなたの応答があると思うので、 'String'で' GsonConverterFactory'で変換する必要はありません –

+0

生のjsonレスポンスはどのように見えますか? – MidasLefko

+0

生の呼び出しは次のようになります。Request {method = GET、url = http://10.0.2.2:8080/DGCWS/rest/photo/1ead0a1f-bbc4-46bd-901c-7988c0e6c68b、tag = null}私は呼び出し結果がonFailureメソッド – tornic

答えて

0

サーバーから取得しているJSONを確認してください。私の場合、サーバーから取得していたJSONは無効です。

郵便配達員やその他のツールからJSONを確認してみてください。

+0

こんにちはShivam。お返事をありがとうございます。私はそれをして、私は正しい答えを得る(base64の写真)。 – tornic

0

M Dさんのように(大変ありがとう!)、解決策はToStringCorverterFactoryのGsonConverterを変更することです。

これは私が使用するクラスです。

import java.io.IOException; 
import java.lang.annotation.Annotation; 
import java.lang.reflect.Type; 
import okhttp3.MediaType; 
import okhttp3.RequestBody; 
import okhttp3.ResponseBody; 
import retrofit2.Converter; 
import retrofit2.Retrofit; 

public class ToStringConverterFactory extends Converter.Factory { 
    private static final MediaType MEDIA_TYPE = MediaType.parse("text/plain"); 

    @Override 
    public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) { 
     if (String.class.equals(type)) { 
      return new Converter<ResponseBody, String>() { 
       @Override 
       public String convert(ResponseBody value) throws IOException { 
        return value.string(); 
       } 
      }; 
     } 
     return null; 
    } 

    @Override 
    public Converter<?, RequestBody> requestBodyConverter(Type type, Annotation[] parameterAnnotations, 
                  Annotation[] methodAnnotations, Retrofit retrofit) { 

     if (String.class.equals(type)) { 
      return new Converter<String, RequestBody>() { 
       @Override 
       public RequestBody convert(String value) throws IOException { 
        return RequestBody.create(MEDIA_TYPE, value); 
       } 
      }; 
     } 
     return null; 
    } 
} 

それから、あなたはこれに換装ビルダーを変更する必要があります。

Retrofit retrofit = new Retrofit.Builder() 
         .baseUrl(Global.URL_BASE) 
         .addConverterFactory(new ToStringConverterFactory()) 
         .build(); 
関連する問題