Retrofit Parsing中的url没有响应
Posted
技术标签:
【中文标题】Retrofit Parsing中的url没有响应【英文标题】:No response from url in Retrofit Parsing 【发布时间】:2018-08-23 10:27:55 【问题描述】:我正在使用改造实现 json 解析,但我没有从 url 得到任何响应。 Json 数据是数组的形式,里面有对象。我试图在 TextView 中设置来自 Url 的响应。我已经实现如下:
我的JSON结构如下:
[
"id": "2",
"name": "Nbn",
"code": "001",
"ecozone": "ter",
"devregion": "east"
,
"id": "3",
"name": "hari",
"code": "002",
"ecozone": "hill",
"devregion": "west"
]
API 服务
public interface ApiService
@GET("/data_new.php?q=district")
Call<District> getMyJSON();
改造客户端
public class RetrofitClient
private static final String url = "url/";
private static Retrofit getRetrofitInstance()
OkHttpClient client=new OkHttpClient();
return new Retrofit.Builder()
.baseUrl(url)
.client(client)
.addConverterFactory(GsonConverterFactory.create())
.build();
public static ApiService getApiService()
return getRetrofitInstance().create(ApiService.class);
我的 ModelDto 类
public class DistrictDTO
@SerializedName("id")
@Expose
String id;
public String getId()
return id;
public void setId(String id)
this.id = id;
@SerializedName("name")
@Expose
String name;
public String getName()
return name;
public void setName(String name)
this.name = name;
@SerializedName("code")
@Expose
String code;
public String getCode()
return code;
public void setCode(String code)
this.code = code;
@SerializedName("ecozone")
@Expose
String ecozone;
public String getEcozone()
return ecozone;
public void setEcozone(String ecozone)
this.ecozone = ecozone;
@SerializedName("devregion")
@Expose
String devregion;
public String getDevregion()
return devregion;
public void setDevregion(String devregion)
this.devregion = devregion;
区DTO
public class District
public ArrayList<DistrictDTO> districtDTOS;
public ArrayList<DistrictDTO> getDistrictDTOS()
return districtDTOS;
public void setDistrictDTOS(ArrayList<DistrictDTO> districtDTOS)
this.districtDTOS = districtDTOS;
和活动
public class DistrictActivity extends AppCompatActivity
private ArrayList<DistrictDTO> district;
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_district);
district = new ArrayList<>();
textView = (TextView) findViewById(R.id.textVi);
ApiService api = RetrofitClient.getApiService();
retrofit2.Call<District> call = api.getMyJSON();
call.enqueue(new Callback<District>()
@Override
public void onResponse(retrofit2.Call<District> call, Response<District> response)
if (response.isSuccessful())
//got successfully
district = response.body().getDistrictDTOS();
Log.e("Respose", "" + district);
textView.setText(response.body().getDistrictDTOS().toString());
@Override
public void onFailure(retrofit2.Call<District> call, Throwable t)
t.fillInStackTrace();
);
【问题讨论】:
它应该是数组,您将对象作为响应...调用数组或列表 你能解释一下怎么做吗? @SantanuSur 在您的District
类中将您的 ArrayList<DistrictDTO>
更改为 List<DistrictDTO>
附加提示:如果类字段被准确命名为键,则不需要@SerializedName
;)
@Nbn 尝试从您的端点获取数组而不是对象,请参阅下面的答案
【参考方案1】:
试试
public interface ApiService
@GET("/data_new.php?q=district")
Call<District[]> getMyJSON();
你调用的是一个数组,而不是一个对象
编辑:
实际上,我认为您应该将类 DistrictDTO 重命名为 District,并删除另一个。并且,将您想要该数组的所有部分更改为District[]
【讨论】:
【参考方案2】:只需进行这些更改它应该可以工作(返回数组而不是对象)
public class DistrictActivity extends AppCompatActivity
private ArrayList<DistrictDTO> district;
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_district);
district = new ArrayList<>();
textView = (TextView) findViewById(R.id.textVi);
ApiService api = RetrofitClient.getApiService();
retrofit2.Call<List<DistrictDTO>> call = api.getMyJSON();
call.enqueue(new Callback<List<DistrictDTO>>()
@Override
public void onResponse(retrofit2.Call<List<DistrictDTO>> call, Response<List<DistrictDTO>> response)
if (response.isSuccessful())
//got successfully
district = response.body().toString();
Log.e("Respose", "" + district);
textView.setText(response.body().toString());
@Override
public void onFailure(retrofit2.Call<List<DistrictDTO>> call, Throwable t)
Toast.makeText(DistrictActivity.this,t.toString(),Toast.LENGTH_SHORT).show();
t.fillInStackTrace();
);
你的界面应该是这样的
public interface ApiService
@GET("/data_new.php?q=district")
Call<List<DistrictDTO>> getMyJSON();
事实上你应该期望一个数组而不是一个像上面这样的对象,只返回一个DistrictDTO
的列表,District
不需要类
仅供参考:当来自服务器的响应是 ..
的形式时,您应该期待一个对象(就像您所做的那样)但是当它像 [..]
它是一个 json 数组时,因此您应该期待一个数组(这是您的情况,就像我在回答中所做的那样)
【讨论】:
您能解释一下如何返回 DistrictDTO 的列表吗? 只需将改造的call
返回类型更改为<List<DistrictDTO>>
,如上所述,同时更改Api Service
和您的活动
@Nbn 我在我的回答中的fyi
部分添加了关于如何解析 json 的说明
我已经按照你的指示实施了,但问题还是一样@fix
@Nbn 在onFailure
callabck 添加祝酒词,就像我在答案中更新并检查错误是什么以上是关于Retrofit Parsing中的url没有响应的主要内容,如果未能解决你的问题,请参考以下文章
通过 Retrofit 中的 Model 类在 GET 请求 URL 中传递 ID
如何使用Retrofit 2和Gson来模拟JSON响应“密钥”频繁更改的数据
Dagger2+Retrofit 使用 Subcomponent 更改 URL:如果没有 @Provides- 或 @Produces-annotated 方法,则无法提供