arrays - 如何使用 gson/retrofit 获取对象数组?

标签 arrays gson retrofit

我之前使用过 gson 自动转换为 pojo 的。

但现在我试图使用改造将 api 结果转换为对象。

只要 json 命名了对象数组,就没有问题:

例如。:

{
    items:[
        {"name":"foo"},
        {"name":"bar"}
    ]
}
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);
}

这将自动工作。

但是如果 json 数组没有命名怎么办?

例如。:
[
    {"name":"foo"},
    {"name":"bar"}
]

我知道在不使用带有 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());
}

最佳答案

像这样处理 json 响应:

[
    {"name":"foo"},
    {"name":"bar"}
]

使用调用<列表>

在 Retrofit2 中,HttpUrl.resolve() 用于解析 baseUrl 和带注释的路径。

由于这是如何工作的,

这有效:
.baseUrl("http://someurl.com")

@GET("/api/itemlist")    --> resolved to http://someurl.com/api/itemlist

或者这有效
.baseUrl("http://someurl.com/api/")

@GET("itemlist")    --->  resolved to http://someurl.com/api/itemlist

但是,这行不通
.baseUrl("http://someurl.com/api")

 @GET("/itemlist")   ---> resolved to http://someurl.com/itemlist

关于arrays - 如何使用 gson/retrofit 获取对象数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34623053/

相关文章:

android - Gson 在 Android Studio 调试器中运行缓慢

java - 改造 2 和 GSON java.lang.IllegalArgumentException : Field map contained null value for key

android - 入队 onResponse 方法在 android 改造中返回空的 response.body()

Android - 如何在 Robospice/retrofit 中获取 JSON 格式的请求和响应

java - 为什么我的改造后请求不起作用?

java - 将 JSONArray 转换为 POJO 类 List<type>,无法转换

javascript - 如何根据数组上有多少索引来显示动态的 div 集

c - 如何将c中的整个文件读入数字数组

javascript - React redux如何使用过滤器比较两个obj数组

Java Gson - 从 JSON 树获取特定值