android - 为什么 onResponse 方法不起作用?Retrofit2 库
问题描述
我想使用 Retrofit2 和 Gson 库通过 GET 接收 Json 的字符串列表。当我.../titlefaqsjson?_format=json
使用 POSTMAN 执行 GET 时,我以这种方式接收 Json:
[
{
"tid": [
{
"value": 27
}
],
"uuid": [
{
"value": "b3d3c5bb-6a8b-40c1-bafe-d4ddf3a45ff3"
}
],
"langcode": [
{
"value": "en"
}
],
"vid": [
{
"target_id": "faq",
"target_type": "taxonomy_vocabulary",
"target_uuid": "a225614a-917b-4b0d-861b-9113d5a47fa3"
}
],
"name": [
{
"value": "Buscar una SocialFood"
}
],
"description": [
{
"value": null,
"format": null,
"processed": ""
}
],
"weight": [
{
"value": 0
}
],
"parent": [],
"changed": [
{
"value": "2018-05-31T11:42:24+00:00",
"format": "Y-m-d\\TH:i:sP"
}
],
"default_langcode": [
{
"value": true
}
],
"path": [
{
"alias": "/faq/soy-socialguest/buscar-una-socialfood",
"pid": 35,
"langcode": "en"
}
]
},
{
"tid": [
{
"value": 28
}
],
"uuid": [
{
"value": "e2d05fc8-840c-4cc2-8df2-2cd2bf45ee85"
}
],
"langcode": [
{
"value": "en"
}
],
"vid": [
{
"target_id": "faq",
"target_type": "taxonomy_vocabulary",
"target_uuid": "a225614a-917b-4b0d-861b-9113d5a47fa3"
}
],
"name": [
{
"value": "Cancelar una reserva antes de la SocialFood"
}
],
"description": [
{
"value": null,
"format": null,
"processed": ""
}
],
"weight": [
{
"value": 1
}
],
"parent": [],
"changed": [
{
"value": "2018-05-31T11:53:54+00:00",
"format": "Y-m-d\\TH:i:sP"
}
],
"default_langcode": [
{
"value": true
}
],
"path": [
{
"alias": "/faq/soy-socialguest/cancelar-una-reserva-antes-de-la-socialfood",
"pid": 36,
"langcode": "en"
}
]
}, etc..
我有以这种方式声明 GET 的界面:
public interface ApiSocialFood {
@GET("titlefaqsjson?_format=json")
Call<ResponseFaqs> faqs();
}
ResponseFaqs 对象的类是一个简单的类,具有一个字符串列表作为属性、构造函数以及相应的 getter 和 setter。
接收到的 Json 的 Desserializer 代码是:
public class FaqsDeserializador implements JsonDeserializer {
@Override
public ResponseFaqs deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
JsonArray arrayJson = json.getAsJsonObject().get("name").getAsJsonArray();
List<String> lista= new ArrayList<String>();
for (int i=0;i<arrayJson.size();i++){
Log.d("xxx",arrayJson.get(i).getAsJsonObject().get("value").getAsString());
lista.add(arrayJson.get(i).getAsJsonObject().get("value").getAsString());
}
ResponseFaqs respuesta = new ResponseFaqs(lista);
return respuesta;
}
}
我通过以下方式执行 Activity 的 onCreate 方法中的所有内容:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity__preguntas__frecuentes);
tvTitulo1= (TextView) findViewById(R.id.textView13);
GsonBuilder builder=new GsonBuilder();
builder.registerTypeAdapter(ResponseFaqs.class,new FaqsDeserializador());
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(Api.URL_BASE)
.addConverterFactory(GsonConverterFactory.create(builder.create()))
.build();
ApiSocialFood Service = retrofit.create(ApiSocialFood.class);
Call<ResponseFaqs> peticionFaqs=Service.faqs();
peticionFaqs.enqueue(new Callback<ResponseFaqs>() {
@Override
public void onResponse(Call<ResponseFaqs> call, Response<ResponseFaqs> response) {
if (response.code()== HttpURLConnection.HTTP_OK) {
Toast.makeText(Activity_Preguntas_Frecuentes.this, "DENTRO DE LA IMAGEN", Toast.LENGTH_LONG).show();
List<String> listafaqs = response.body().getListafaqs();
tvTitulo1.setText(listafaqs.get(0));
}else{
Toast.makeText(Activity_Preguntas_Frecuentes.this, "NO HTTP_OK", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call<ResponseFaqs> call, Throwable t) {
Toast.makeText(Activity_Preguntas_Frecuentes.this,"FALLO CONEXION",Toast.LENGTH_SHORT);
}
});
}
但是当我输入要加载列表的活动时,程序会随时进入 OnResponse 方法。你为什么不进入?我以相同的方式获取另一个 json 的名称和 url,它运行良好,我不知道为什么在这种情况下它不起作用。
提前致谢 :)
解决方案
我找到了解决方案!
与计算机科学中的大多数时间一样,错误是您错过的愚蠢行为。
在这种情况下,返回的 Json 以 arrayJson 开头,而不是 Json 对象,因此您所要做的就是添加反序列化此步骤的方法。
类 deserialieze 将是这样的:
公共类 FaqsDeserializador 实现 JsonDeserializer {
@Override
public ResponseFaqs deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
JsonArray arrayJson = json.getAsJsonArray();
List<String> lista= new ArrayList<String>();
for (int i=0;i<arrayJson.size();i++){
Log.d("SocialFoodAPPAlvaro",arrayJson.get(i).getAsJsonObject().get("name").getAsJsonArray().get(0).getAsJsonObject().get("value").getAsString());
lista.add(arrayJson.get(i).getAsJsonObject().get("name").getAsJsonArray().get(0).getAsJsonObject().get("value").getAsString());
}
ResponseFaqs respuesta = new ResponseFaqs(lista);
return respuesta;
}
推荐阅读
- python-3.x - 在类而不是对象上调用方法
- python - 使用 Python 从文件内容编写 splunk 查询
- python - 使用正则表达式有效地将一列中的部分值替换为熊猫中另一列的值?
- python - 为什么在 Tensorflow nan 中丢失了我的简单 NN?
- eclipse - “hello world”使 Eclipse 调试模式崩溃
- java - 如何从动态实现接口的类中获取方法?
- angular - 如何使用带有命名路由器出口和 url 参数的 Router.navigate()
- javascript - 使用 css 制作动画
- tensorflow - Tensorflow slim inception resnet v2 inference
- recaptcha - 如何使用 reCAPTCHA v3 设置徽章位置?