【问题标题】:No response from url in Retrofit ParsingRetrofit Parsing中的url没有响应
【发布时间】: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&lt;DistrictDTO&gt; 更改为 List&lt;DistrictDTO&gt;
  • 附加提示:如果类字段被准确命名为键,则不需要@SerializedName ;)
  • @Nbn 尝试从您的端点获取数组而不是对象,请参阅下面的答案

标签: android parsing retrofit


【解决方案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 返回类型更改为&lt;List&lt;DistrictDTO&gt;&gt;,如上所述,同时更改Api Service 和您的活动
    • @Nbn 我在我的回答中的fyi 部分添加了关于如何解析 json 的说明
    • 我已经按照你的指示实施了,但问题还是一样@fix
    • @Nbn 在onFailure callabck 添加祝酒词,就像我在答案中更新并检查错误是什么
    猜你喜欢
    • 2018-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-13
    • 2015-10-12
    • 1970-01-01
    • 1970-01-01
    • 2017-06-19
    相关资源
    最近更新 更多