dil*_*lux 5 arrays gson retrofit
我以前使用过gson自动转换为pojo的。
但现在我正在尝试使用改造将api结果转换为对象。
只要json已命名对象数组,就没有问题:
{
items:[
{"name":"foo"},
{"name":"bar"}
]
}
Run Code Online (Sandbox Code Playgroud)
public class AnItem {
String name;
}
public class MyItems {
List<AnItem> items;
}
public interface MyApi {
@GET("/itemlist")
Call<MyItems> loadItems();
}
public boolean onOptionsItemSelected(MenuItem item) {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://someurl.com/api")
.addConverterFactory(GsonConverterFactory.create())
.build();
MyApi myApi = retrofit.create(MyApi.class);
Call<MyApi> call = myApi.loadItems();
call.enqueue(this);
return true;
}
@Override
public void onResponse(Response<MyItems> response, Retrofit retrofit) {
ArrayAdapter<AnItem> adapter = (ArrayAdapter<AnItem>) getListAdapter();
adapter.clear();
adapter.addAll(response.body().items);
}
Run Code Online (Sandbox Code Playgroud)
这将自动工作。
但是如果未命名json数组怎么办?
[
{"name":"foo"},
{"name":"bar"}
]
Run Code Online (Sandbox Code Playgroud)
我不知道如何不使用parsejson进行改造,而是遍历数组以获取对象,但我无法做到这一点,因为该部分通过改造和gson进行了自动化。
香港专业教育学院真的被困在这个问题上一段时间了,任何指针将不胜感激。
更新:
below are the parts i have changed MyItems to List<AnItem>:
public class AllTemplatesRetroActivity extends ListActivity implements Callback<List<AnItem>> {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
requestWindowFeature(Window.FEATURE_PROGRESS);
ArrayAdapter<AnItem> arrayAdapter =
new ArrayAdapter<AnItem>(this,
android.R.layout.simple_list_item_1,
android.R.id.text1,
new ArrayList<AnItem>());
setListAdapter(arrayAdapter);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://someurl.com/api")
.addConverterFactory(GsonConverterFactory.create())
.build();
MyApi myApi = retrofit.create(MyApi.class);
Call<List<AnItem>> call = myApi.loadItems();
call.enqueue(this);
return true;
}
@Override
public void onResponse(Response<List<AnItem>> response, Retrofit retrofit) {
ArrayAdapter<AnItem> adapter = (ArrayAdapter<AnItem>) getListAdapter();
adapter.clear();
Log.i("##MYLOG###", "## response:"+ response.message());
adapter.addAll(response.body());
}
Run Code Online (Sandbox Code Playgroud)
像这样处理 json 响应:
[
{"name":"foo"},
{"name":"bar"}
]
Run Code Online (Sandbox Code Playgroud)
使用调用<列表<AnItem>>
在 Retrofit2 中,HttpUrl.resolve() 用于解析 baseUrl 和带注释的路径。
由于这是如何工作的,
这有效:
.baseUrl("http://someurl.com")
@GET("/api/itemlist") --> resolved to http://someurl.com/api/itemlist
Run Code Online (Sandbox Code Playgroud)
或者这有效
.baseUrl("http://someurl.com/api/")
@GET("itemlist") ---> resolved to http://someurl.com/api/itemlist
Run Code Online (Sandbox Code Playgroud)
但是,这行不通
.baseUrl("http://someurl.com/api")
@GET("/itemlist") ---> resolved to http://someurl.com/itemlist
Run Code Online (Sandbox Code Playgroud)