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

2023-11-27

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

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

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

e.g.:

{
    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 数组没有命名怎么办?

e.g.:

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

我知道在不使用带有 parsejson 的改造并迭代数组来获取我的对象时如何做到这一点,但我不能那样做,因为该部分是通过改造和 gson 自动化的。

我已经被这个问题困扰了一段时间了,任何指点都将非常感激。

UPDATE:

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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 gson/retrofit 获取对象数组? 的相关文章

随机推荐

  • 在我的 css 类中使用 Zoom:1 可以吗?

    每当我发现 IE 显示我的网站很奇怪 与 Chrome 和 Firefox 不同 时 我会尝试放置zoom 1在 css 类中显示奇怪的部分 很多时候这可以解决问题并使其看起来与其他浏览器一致 使用有问题吗zoom 1 我知道我的 CSS
  • CFMessagePort 和沙箱

    我正在调整 MacOS 应用程序以使用沙箱 它使用一个辅助应用程序 同一包中的 exe 当我尝试在控制台中使用 拒绝 mach lookup 消息调用 CFMessagePortCreateRemote 时 该应用程序会失败 我可以看到co
  • PHP mb_ereg_replace 未替换,而 preg_replace 按预期工作

    我正在尝试将字符串中所有非单词字符替换为空字符串 除了空格 并将所有多个空格放在一起作为一个空格 以下代码执行此操作 cleanedString preg replace w name cleanedString preg replace
  • 将 numpy 中数组元素的所有组合相乘

    注意 我对 只需使用 for 循环进行操作 之类的答案不感兴趣 我想以 numpyish 的方式进行操作 我是 Python 初学者 我想使用 numpy ndarray 执行以下操作 给定一个数字序列t和另一个数字序列b 对于每一个t i
  • Asyncio 检测断开连接挂起

    我在 Python 3 4 中使用 Asyncio 我将尝试解释到目前为止我正在做的事情以及我 认为 导致问题的原因 一方面 我有一个具有阻塞操作的 UDP 连接框架 我将从该流中获取的数据创建为 SSE 格式传递给客户端的 json 这一
  • 从 Brocfile 的构建中排除文件夹

    有没有办法从 Brocfile 或任何其他地方 的构建中排除文件夹 用例是打包 我有一个由 pod 内的子应用程序组成的应用程序 例如 app modules components app modules app1 app modules
  • jquery中有没有办法将点击事件绑定到div的左边框?

    我有一个div div div 有没有办法将点击事件绑定到这个div的左边框 提前致谢 div height 100px border 4px solid black padding 10px 请尝试这个方法 div click funct
  • Python 中的浏览文件或目录对话框

    我正在用 Python 做一个小项目 我想浏览文件或目录以获取它们的路径 我正在使用 Tkinter 但只能找到一个文件浏览器 filename tkFileDialog askopenfilename parent root title
  • Read.csv() 抛出错误

    我一直在尝试读取 Excel 文件 但似乎有问题 该文件以 Excel 格式存储在 Documents 文件夹中 这些是我收到的错误消息 table lt read csv file choose header T sep t Warnin
  • 使用 MongoDB 制作类似 Twitter 的时间线

    我需要的 假设您正在使用 MongoDB 并且有一个名为users 每个用户都有一个 以下 数组 其中包含 user id他所关注的人的信息 然后你就有了另一个收藏statuses 每个状态包含 id它的作者 如何向某个用户显示他所关注的人
  • Netty 4 中的缓冲区所有权:如何管理缓冲区生命周期?

    我一直在尝试编写一个 HTTP 客户端来同时获取多个提要 最多 1k 同时也是学习 Netty 4 的练习 我的问题是 是否有关于新 ByteBuf 基础设施如何工作的很好的解释 谁 拥有 它们 它们如何共享 是吗 ChannelPipel
  • 如何设置热图中的中心颜色

    我想在seaborn 中绘制热图 我的代码如下 plt rcParams font size 13 plt rcParams font weight bold my dpi 96 fig ax plt subplots figsize 80
  • C# 代表现实世界的用法 [重复]

    这个问题在这里已经有答案了 我之前问过一个关于委托的问题 是否有人有一个必须使用委托的场景 这如何改进我的 C 代码 正如我使用它的许多场景一样 我似乎总是能够围绕它进行编程 每当您使用策略模式或者观察者模式 委托使您的工作比使用接口更容易
  • 在没有 Apple Developer Program (Xcode 7) 的情况下在 iOS 上安装应用程序

    6 月 8 日 Apple 宣布通过 Xcode 7 每个人都可以在自己的设备上安装他们开发的任何应用程序 而无需 Apple 开发者计划证书 Apple 开发者网站称您只需使用 Apple ID 登录即可 我已经在 Xcode 上做到了这
  • GroupMe 如何验证我的号码?

    我正在开发一个 iPhone 应用程序 我需要用户的电话号码 根据我读到的内容 例如这里 在 iOS 中以编程方式获取自己的电话号码 设备的电话号码在您的应用程序容器中不可用 我总是让用户输入他或她自己的号码 但是 当我前几天加入 Grou
  • OpenCL 中零拷贝的访问路径

    我对零拷贝到底是如何工作的有点困惑 1 想要确认以下内容对应于opencl中的零复制 CPU SYSTEM RAM c3 X lt gt PCI E c2 X PCI E CPU directly accessing GPU memory
  • Heroku:如何部署客户端和服务器在不同端口上运行的节点应用程序?

    我有一个 Nodejs API 作为服务器 React Redux 应用程序作为客户端 位于一个 git 项目中 https github com lafisrap fcc nightlife git 我想使用 heroku cli 将其部
  • 非静态方法需要一个目标

    我有一个控制器操作 可以在本地和生产中的 Firefox 以及本地 IE 上正常工作 但不能在生产中的 IE 上工作 这是我的控制器操作 public ActionResult MNPurchase CalculationViewModel
  • maven 使用 --add-exports 运行和构建

    我尝试在 Win 10 计算机上使用 InteliJ 和 Maven 运行我的应用程序 如果我跑 mvn clean javafx run 我的 GUI 启动 但如果我使用 org controlsfx control textfield
  • 如何使用 gson/retrofit 获取对象数组?

    我之前用过gson自动转换为pojo的 但现在我尝试使用改造将 api 结果转换为对象 只要 json 具有命名对象数组 就没有问题 e g items name foo name bar public class AnItem Strin