crear - gson android studio
Cómo obtener una respuesta como String usando retrofit sin usar GSON o cualquier otra biblioteca en Android (1)
** Actualización ** Se ha agregado un convertidor de escalares a la actualización que permite una respuesta de
String
con menos ceremonia que mi respuesta original a continuación.
Interfaz de ejemplo:
public interface GitHubService {
@GET("/users/{user}")
Call<String> listRepos(@Path("user") String user);
}
Agregue
ScalarsConverterFactory
a su generador de
ScalarsConverterFactory
.
Nota:
Si usa
ScalarsConverterFactory
y otra fábrica,
agregue primero la fábrica de escalares.
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(ScalarsConverterFactory.create())
// add other factories here, if needed.
.build();
También deberá incluir el convertidor de escalares en su archivo gradle:
implementation ''com.squareup.retrofit2:converter-scalars:2.1.0''
--- Respuesta original (todavía funciona, solo más código) ---
Estoy de acuerdo con @CommonsWare en que parece un poco extraño que desee interceptar la solicitud para procesar el JSON usted mismo.
La mayoría de las veces, el POJO tiene todos los datos que necesita, por lo que no necesita perder el tiempo en
JSONObject
land.
Sospecho que su problema específico podría resolverse mejor utilizando un Adaptador de
TypeAdapter
gson personalizado o un
Converter
TypeAdapter
si necesita manipular el JSON.
Sin embargo, la actualización proporciona más el análisis JSON justo a través de Gson.
También gestiona muchas de las otras tareas tediosas involucradas en las solicitudes REST.
El hecho de que no desee utilizar una de las funciones no significa que deba deshacerse de todo.
Hay veces que solo quieres obtener la transmisión sin procesar, así que aquí está cómo hacerlo:
Primero, si está usando Retrofit 2, debe comenzar a usar la API de
Call
.
En lugar de enviar un objeto para convertir como parámetro de tipo, use
ResponseBody
de okhttp -
public interface GitHubService {
@GET("/users/{user}")
Call<ResponseBody> listRepos(@Path("user") String user);
}
entonces puedes crear y ejecutar tu llamada -
GitHubService service = retrofit.create(GitHubService.class);
Call<ResponseBody> result = service.listRepos(username);
result.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Response<ResponseBody> response) {
try {
System.out.println(response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(Throwable t) {
e.printStackTrace();
}
});
Nota:
el código anterior llama a
string()
en el objeto de respuesta, que lee la respuesta completa en una cadena.
Si está pasando el cuerpo a algo que puede ingerir transmisiones, puede llamar a
charStream()
lugar.
Ver los documentos de
ResponseBody
.
Esta pregunta ya tiene una respuesta aquí:
Estoy tratando de obtener respuesta de la siguiente API:
https://api.github.com/users/username
Pero no sé cómo obtener una respuesta como
String
para poder usar el
String
para analizar y obtener el
JSONObject
.
Versión de modificación utilizada:
actualización: 2.0.0-beta1
He intentado esto hasta ahora:
public interface GitHubService {
@GET("/users/{user}")
public String listRepos(@Path("user") String user,Callback<String> callback);
}
recuperando:
GitHubService service = retrofit.create(GitHubService.class);
service.listRepos("username", new Callback<String>() {
@Override
public void onResponse(Response response) {
System.out.println(response.toString());
}
@Override
public void onFailure(Throwable t) {
}
});
excepción:
Caused by: java.lang.IllegalArgumentException: Could not locate call adapter for class java.lang.String. Tried:
* retrofit.ExecutorCallAdapterFactory
at retrofit.Utils.resolveCallAdapter(Utils.java:67)
at retrofit.MethodHandler.createCallAdapter(MethodHandler.java:49)
Cualquier ayuda sería muy apreciada.