2017-07-06 1 views
1

J'essaie de faire un appel de retrofit et je reçois MalformedJsonException.MalformedJsonException sur Retrofit et Gson

Ceci est mon appel:

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); 

Ceci est mon interface:

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

Le enqueue d'appel entre méthode onFailure, et l'erreur est « com.google.gson.stream.MalformedJsonException: Utilisez JsonReader.setLenient (true) pour accepter JSON mal formé à la ligne 1 colonne 2 chemin $ ".

Je fis les changements à mettre en indulgente comme ceci:

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

Ensuite, j'ai une autre erreur: « com.google.gson.stream.MalformedJsonException: Valeur attendue à la ligne 1 colonne 1 chemin $ »

Je pense que l'erreur est peut-être dans la conversion de Gson de la valeur de chaîne idFoto, mais je ne sais pas ce qui ne va pas.

Quelqu'un peut-il m'aider s'il vous plaît?

Merci les gars!

+1

Vous devriez nécessaire 'ToStringConverterFactory' parce que je pense que votre réponse est dans 'String' donc pas besoin de convertir dans' GsonConverterFactory' –

+0

pouvez-vous voir à quoi ressemble la réponse brute de JSON? – MidasLefko

+0

L'appel brut ressemble à ceci: Request {method = GET, url = http: //10.0.2.2: 8080/DGCWS/rest/photo/1ead0a1f-bbc4-46bd-901c-7988c0e6c68b, tag = null}. Je ne sais pas où voir la réponse json brut lorsque le résultat de l'appel entre sur onFailure méthode – tornic

Répondre

0

S'il vous plaît vérifier le JSON que vous obtenez du serveur, dans mon cas JSON que je recevais du serveur n'était pas valide. Essayez de vérifier votre JSON à partir de Postman ou d'un autre outil.

+0

Salut Shivam. Merci pour votre réponse. Je l'ai fait et j'obtiens la bonne réponse (une photo en base64). – tornic

0

Comme M D dit (merci beaucoup mec!), La solution est de changer GsonConverter pour ToStringCorverterFactory.

Ceci est la classe que j'utilise:

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; 
    } 
} 

Et puis il vous suffit de changer le constructeur de rénovation à ceci:

Retrofit retrofit = new Retrofit.Builder() 
         .baseUrl(Global.URL_BASE) 
         .addConverterFactory(new ToStringConverterFactory()) 
         .build();